1

モデル/コントローラーにそのようなロジックを配置するのではなく、サービスクラスを使用してエンティティをデータベースに永続化する必要があることを学びました。私は現在、サービスクラスを次のようなものにしました

class Application_DAO_User {
    protected $user;
    public function __construct(User $user) {
        $this->user = $user
    }
    public function edit($name, ...) {
        $this->user->name = $name;
        ...
        $this->em->flush();
    }
}

これがサービスクラスの構造なのかしら?サービスオブジェクトはエンティティ/モデルを表しますか?または、次のような編集を行うたびにUserオブジェクトを渡す必要があります。

public static function edit($user, $name) {
    $user->name = $name;
    $this->em->flush();
}

Doctrine2とZendFrameworkを使用していますが、問題ありません。

4

1 に答える 1

1

まず、ユーザーオブジェクトで何をしたいのかを考えるべきだと思います。たとえば、ユーザーレコード(CRUD)の作成、更新、削除のみを行う場合は、次のタイプのAPIを想像できます。

<?php
public function create (array $data = null)
{
    $user = new User($data);
    $this->_persist($user)
         ->_flush();

    return $user;
}

public function update (User $user, array $data)
{
    foreach ($data as $name => $value) {
        $user->$name = $value;
    }

    $this->_flush();

    return $user;
}

public function delete (User $user)
{
    $this->_remove($user)
         ->_flush();
}

メソッドをエンティティマネージャーに分離しました。以下のようなものを作成するか、分離されたメソッドをスキップすることができます。これらのメソッドを使用すると、追加のチェックを行うことができます(たとえば、永続化する場合は、オブジェクトがすでに永続化されているかどうかを確認するためのチェックがあります)。

protected function _persist ($obj)
{
    $this->_em->persist($obj);
    return $this;
}

protected function _detach ($obj)
{
    $this->_em->detach($obj);
    return $this;
}

protected function _remove ($obj)
{
    $this->_em->remove($obj);
    return $this;
}

protected function _flush ()
{
    $this->_em->flush();
    return $this;
}
于 2010-12-27T12:03:42.550 に答える