0

我已经将一个 PHP 应用程序转换为 Symfony2 并且还有另一个结构性问题......

在我的旧应用程序中,我将拥有可能作用于其他实体类的实体类……例如,我有一个搜索类和一个结果类。像 search->updateSearch() 这样的函数将对搜索类及其子结果类 ($this->result->setFoo('bar') 进行操作。这只是实体相关函数的一个示例,它不'不属于 Symfony2 的实体类。

据我所知,似乎最符合 symfonyesque 的方法是创建一个服务,类似于 searchHelper 类,我可以将实体管理器、$search 和 $result 类传递给它,并在那里对它们进行操作.

这听起来像是最好的行动方案吗?

谢谢!

4

2 回答 2

2

对于这个场景,我使用模型管理器,它旨在成为与实体操作的业务层 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

听起来您应该使用学说自定义存储库类。你可以在这里查看它们:http: //symfony.com/doc/current/book/doctrine.html#custom-repository-classes

基本上,它们允许您在基本实体之外添加自定义逻辑。也因为它们基本上是实体的扩展,所以很容易加载它们并使用它们的功能:

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

然后是该实体的 repo 文件:

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

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

然后从您的控制器中,您可以加载 repo 并使用该功能:

//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 回答