1

私が読んだすべてのチュートリアルから、サービスレイヤーには1つまたは2つのメソッドしかないように見えるので、必要な数のメソッドを持つファットではなく、サービスが軽量/スキニーであると想定されているかどうかはわかりません

私がPostドメインオブジェクトを持っていて、PostServiceクラスを持っている場合、投稿を削除したい場合は、コントローラー内からこれを実行する必要があります。

$postService = $this->serviceFactory->build('post');
$postService->deletePost($id);

deletePost()内部のメソッドPostServiceは次のようなものです。

$postMapper = $this->dataMapperFactory->build('post');
$post = $postMapper->fetchById($id);
// Check if the post exists
// Check if it belongs to this user
// Some other checks
$postMapper->delete($post);

あれは正しいですか?基本的に、ドメインオブジェクトは単なる値オブジェクトであり、すべての作業はサービスレイヤーで行われますか?

どんな助けでも大いに感謝します。

4

1 に答える 1

3

あなたの問題の一部は実際にはマッパーにあるようです。私見ですが、マッパーはドメインオブジェクトの作成を担当するべきではありません。したがって、サンプルコードは実際には次のようになります。

$mapper = $this->dataMapperFactory->build('post');
$post = $this->domainObjectFactory->build('post');

$post->setId( $id );
$mapper->fetch($post);
// Check if the post exists
// Check if it belongs to this user
// Some other checks
$postMapper->delete($post);

また、これらの「その他のチェック」のほとんどは、実際にはドメインオブジェクトに対して実行されます。例えば:

if ( $post->belongsTo($user) )
{
    ...
}

サービスの役割は「アプリケーションロジック」です。これは、ドメインオブジェクトとマッパー間の相互作用を表す用語です。サービスが他のサービスと相互作用することも一般的です。

補足として

持っているPostServiceことは私には意味がありません。サービスは、モデル層のドメインビジネスロジックの主要なセグメントを表すことになっています。

  • Recognitionの代わりにサービスがUserServiceありLoginServiceます。
  • Contentの代わりにサービスがDocumentServiceありますCommentServiceUserService

ああ..そしてまた、あなたはもう追加し..Serviceたり..Controller接尾辞を付けたりする必要はありません。PHPには現在名前空間があります。

于 2013-02-17T13:37:00.670 に答える