2

Doctrineを使用できるようになると、多くのことが高速化されますが、すべてのコントローラーでエンティティマネージャーを設定/使用する必要があるのは少し不格好です。1つの特定のモジュールにすべてのデータベースロジックを含めることをお勧めします。おそらく私はこれを間違った方法で考えているだけで、誰かが私を正しい方向に向けることができます。

現在、正常に機能するエンティティがあり、次の方法でデータベースへの挿入を正常に行うことができます。

namespace Manage\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;


class ViewController extends AbstractActionController {
    public function somethingAction(){
        $objectManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
        $user = new \Manage\Entity\User();
        $user->setname('foo');
        $user->settitle('bar');        
        $objectManager->persist($user);
        $objectManager->flush();
    }
}

ただし、データベースから何かを選択する場合は、必ず追加する必要があります。

 use Doctrine\ORM\EntityManager;

そして、次のコントローラ機能のリスト...

/**
 * @var EntityManager
 */
protected $entityManager;

/**
 * Sets the EntityManager
 *
 * @param EntityManager $em
 * @access protected
 * @return PostController
 */
protected function setEntityManager(EntityManager $em) {
    $this->entityManager = $em;
    return $this;
}

/**
 * Returns the EntityManager
 *
 * Fetches the EntityManager from ServiceLocator if it has not been initiated
 * and then returns it
 *
 * @access protected
 * @return EntityManager
 */
protected function getEntityManager() {
    if (null === $this->entityManager) {
        $this->setEntityManager($this->getServiceLocator()->get('Doctrine\ORM\EntityManager'));
    }
    return $this->entityManager;
}

すべてを追加したら、getsomethingActionで次のようなクエリを実行できます...

public function getsomethingAction() {
    $repository = $this->getEntityManager()->getRepository('Manage\Entity\User');
    $list = $repository->findAll();
    var_dump($list);
    return new ViewModel();
}

とても不格好な私には...余分な機能をすべて必要とせずに挿入を行うことはできますが、選択を行うことはできませんか?$ repository = $ this-> getEntityManager()-> getRepository('Manage \ Entity \ User');を呼び出すことで提供されるfind / findAllなどの関数を取得するためにEntityクラスを拡張することは可能ですか?エンティティ内に直接?

つまり、データを設定するときと同じように、エンティティに対して直接検索を実行できるようにしたいと思います...以下のように:

public function getsomethingAction(){
    $list = new \Manage\Entity\User();
    $l = $list->findAll();
    var_dump($l);
    return new ViewModel();
}
4

1 に答える 1

3

さて、これまでの私の主な目的は、複雑なロジックをコントローラーから再利用可能なモデルに移動することでした。したがって、この回答例では、複雑なロジックが存在するインターフェイスを作成していますが、コントローラーでモデルを使用してデータベースからデータを取得することもできます...これがモデルです...

namespace Manage\Model;

use Doctrine\ORM\EntityManager;

class ApiInterface {

    /**
     * @var EntityManager
     */
    protected $entityManager;
    protected $sl;

    /**
     * Sets the EntityManager
     *
     * @param EntityManager $em
     * @access protected
     * @return PostController
     */
    protected function setEntityManager(EntityManager $em) {
        $this->entityManager = $em;
        return $this;
    }

    /**
     * Returns the EntityManager
     *
     * Fetches the EntityManager from ServiceLocator if it has not been initiated
     * and then returns it
     *
     * @access protected
     * @return EntityManager
     */
    protected function getEntityManager() {
        if (null === $this->entityManager) {
            $this->setEntityManager($this->sl->get('Doctrine\ORM\EntityManager'));
        }
        return $this->entityManager;
    }

    public function __construct($ServiceLocator) {
        $this->sl = $ServiceLocator;
    }

    public function get() {
        $repository = $this->getEntityManager()->getRepository('Manage\Entity\ApiList');
        return $repository;
    }

    public function set() {
        return new \Manage\Entity\ApiList();
    }

    public function save($data) {
        $objectManager = $this->sl->get('Doctrine\ORM\EntityManager');
        $objectManager->persist($data);
        $objectManager->flush();
    }

    public function doComplexLogic($foo,$bar){
        // Can now use both set() and get() to inspect/modify/add data
    }

}

これで、コントローラー内で、次のようなテーブルから基本データを取得することができます。

public function getapiAction() {
    $api = new \Manage\Model\ApiInterface($this->getServiceLocator());
    var_dump($api->get()->findAll());
    return new ViewModel();
}

そして、コントローラーからデータをすばやく設定するには、次のことができます。

public function setapiAction() {
    $apiInterface = new \Manage\Model\ApiInterface($this->getServiceLocator());
    $api= $apiInterface->set();
    $user->setfoo('blah');
    $user->setbar('moo');
    $apiInterface->save($api);
    return new ViewModel();
}

また、コントローラーから複雑さを取り除くことで、コントローラーから複雑なロジックを実行することもできます...

public function complexAction(){
    $foo = $this->params()->fromQuery();
    $bar = $this->params()->fromPost();
    $apiInterface = new \Manage\Model\ApiInterface($this->getServiceLocator());
    $apiInterface->doComplexLogic($foo, $bar);
}

この答えが物事を行うための適切な方法であるかどうかコメントで知らせてください、私はそれが非常に単純で一般的であることを理解していますが、他の人が何/理由を理解できるように、そしてこれが良いアプローチであるかどうかなどを理解できるようにそれを維持したいと思いました。

于 2013-03-13T21:54:25.667 に答える