0

PHP アプリケーションを Symfony2 に変換しましたが、さらに別の構造的な質問があります...

私の古いアプリケーションでは、他のエンティティ クラスに作用する可能性のあるエンティティ クラスがありました。たとえば、検索クラスと結果クラスがあります。search->updateSearch() のような関数は、検索クラスとその子結果クラス ($this->result->setFoo('bar') で動作します。これはエンティティ関連の関数の 1 つの例にすぎません。 Symfony2 のエンティティ クラスには属しません。

私が知る限り、最も symfonyesque な方法は、エンティティ マネージャー、$search、および $result クラスを渡し、そこで操作できる、searchHelper クラスのラインに沿ったサービスを作成することであると思われます。 .

それが最善の策のように聞こえますか?

ありがとうございました!

4

2 に答える 2

2

このシナリオでは、Model Manager を使用します。これは、エンティティを操作するためのビジネス レイヤー ORM に依存しないインターフェイスになることを目的としています。何かのようなもの:

<?php

/**
 * Group entity manager
 */
class GroupManager
{
    /**
     * Holds the Doctrine entity manager for database interaction
     * @var EntityManager
     */
    protected $em;

    /**
     * Holds the Symfony2 event dispatcher service
     * @var EventDispatcherInterface
     */
    protected $dispatcher;

    /**
     * Entity specific repository, useful for finding entities, for example
     * @var EntityRepository
     */
    protected $repository;

    /**
     * Constructor
     *
     * @param EventDispatcherInterface $dispatcher
     * @param EntityManager $em
     * @param string $class
     */
    public function __construct(EventDispatcherInterface $dispatcher, EntityManager $em)
    {
        $this->dispatcher = $dispatcher;
        $this->em = $em;
        $this->repository = $em->getRepository($class);
    }

    /**
     * @return Group
     */
    public function findGroupBy(array $criteria)
    {
        return $this->repository->findOneBy($criteria);
    }

    /**
     * @return Group
     */
    public function createGroup()
    {
        $group = new Group();

        // Some initialization or creation logic

        return $group;
    }

    /**
     * Update a group object
     *
     * @param Group $group
     * @param boolean $andFlush
     */
    public function updateGroup(Group $group, $andFlush = true)
    {
        $this->em->persist($group);

        if ($andFlush) {
            $this->em->flush();
        }
    }

    /**
     * Add a user to a group
     *
     * @param User $user
     * @param Group $group
     * @return Membership
     */
    public function addUserToGroup(User $user, Group $group)
    {
        $membership= $this->em->getRepository('GroupBundle:Membership')
        ->findOneBy(array(
            'user'  => $user->getId(),
            'group' => $group->getId(),
        ));

        if ($membership && $membership->isActive()) {
            return null;
        } elseif ($membership && !$membership->isActive()) {
            $membership->setActive(true);

            $this->em->persist($membership);
            $this->em->flush();
        } else {
            $membership = new Membership();
            $membership->setUser($user);
            $membership->setGroup($group);

            $this->em->persist($membership);
            $this->em->flush();
        }

        $this->dispatcher->dispatch(
            GroupEvents::USER_JOINED_GROUP, new MembershipEvent($user, $group)
        );

        return $membership;
    }

そして、サービス定義:

<service id="app.model_manager.group" class="App\GroupBundle\Entity\GroupManager">
    <argument type="service" id="event_dispatcher" />
    <argument type="service" id="doctrine.orm.entity_manager" />
</service>

ロガー、メーラー、ルーター、またはその他の必要なサービスを注入できます。

FOSUserBundle マネージャーを参照して、使用方法の例とアイデアを入手してください。

于 2013-10-15T20:27:03.897 に答える
0

doctrines カスタム リポジトリ クラスを使用する必要があるようです。ここで確認できます: http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes

基本的に、これらを使用すると、基本エンティティの上にカスタム ロジックを追加できます。また、これらは基本的にエンティティの拡張であるため、それらを読み込んでその機能を使用するのが非常に簡単になります。

//Basic Entity File
/**
 * @ORM\Entity(repositoryClass="Namespace\Bundle\Repository\ProductRepo")
 */
class Product
{
    //...
}

次に、そのエンティティのリポジトリ ファイル:

//Basic Repo File
use Doctrine\ORM\EntityRepository;

class ProductRepo extends EntityRepository
{
    public function updateSearch($passedParam)
    {
       // Custom query goes here
    }
}

次に、コントローラーからレポをロードして関数を使用できます。

//Controller file
class ProductController extends Controller
{

    public function updateSearchAction()
    {
         $productRepo = $this->getDoctrine()->getManager()->getRepository('Namespace\Bundle\Entity\Product');

         // Set $passedParam to what ever it needs to be

         $productRepo->updateSearch($passedParam);

    }
}
于 2013-10-15T20:20:59.243 に答える