- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想知道在 EntityRepository 类中注入(inject) EventDispatcher 的最佳实践是什么。
最佳答案
首先,使用 global
是一个 very bad practice .我强烈建议你不要这样做。
其次,将服务注入(inject)存储库似乎不是一个好主意。它经常会违反法律,例如 Single Responsibility Principle .
我会创建一个管理器来包装您的存储库的方法,并将触发您需要的事件。参见 how to inject repository to a service了解更多信息。
services.yml
services:
my_manager:
class: Acme\FooBundle\MyManager
arguments:
- @acme_foo.repository
- @event_dispatcher
acme_foo.repository:
class: Acme\FooBundle\Repository\FooRepository
factory_service: doctrine.orm.entity_manager
factory_method: getRepository
arguments:
- "AcmeFooBundle:Foo"
Acme\FooBundle\MyManager
use Acme\FooBundle\Repository\FooRepository;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class MyManager
{
protected $repository;
protected $dispatcher;
public function __construct(FooRepository $repository, EventDispatcherInterface $dispatcher)
{
$this->repository = $repository;
$this->dispatcher = $dispatcher;
}
public function findFooEntities(array $options = array())
{
$event = new PreFindEvent;
$event->setOptions($options);
$this->dispatcher->dispatch('find_foo.pre_find', $event);
$results = $this->repository->findFooEntities($event->getOptions());
$event = new PostFindEvent;
$event->setResults($results);
$this->dispatcher->dispatch('find_foo.post_find', $event);
return $event->getResults();
}
}
然后你可以在你的 Controller 中使用它,就像服务一样。
$this->get('my_manager')->findFooEntities($options);
但是,如果您真的需要将事件调度程序注入(inject)到您的实体中,您可以这样做
services.yml
services:
acme_foo.repository:
class: Acme\FooBundle\Repository\FooRepository
factory_service: doctrine.orm.entity_manager
factory_method: getRepository
arguments:
- "AcmeFooBundle:Foo"
calls:
- [ "setEventDispatcher", [ @event_dispatcher ] ]
然后您只需将 setEventDispatcher
方法添加到您的存储库。
Acme\FooBundle\Repository\FooRepository
class FooRepository extends EntityRepository
{
protected $dispatcher;
public function setEventDispatcher(EventDispatcherInterface $dispatcher)
{
$this->dispatcher = $dispatcher;
}
public function findFooEntities(array $options = array())
{
$dispatcher = $this->dispatcher;
// ...
}
}
只要确保在 Controller 中使用它时调用的是服务而不是存储库。
做
$this->get('acme_foo.repository')->findFooEntities();
不要
$this->getDoctrine()->getManager()->getRepository('AcmeFooBundle:Foo')->findFooEntities();
关于php - 在 EntityRepository 中注入(inject) EventDispatcher 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19380332/
我需要在分页器中显示表中的数据,同时获取子表中记录的计数。有太多子记录无法加载到内存中并进行计数,因此我想修改在我的 EntityRepository 中构建查询的方式。 理想情况下,我不想重新实现寻
当使用 Doctrine2 时 EntityRepository::findBy()我还需要转义我传入的值吗? $em->getRepository('User')->findBy(array('na
我遇到了这个问题我有一个在所有存储库中重复的方法,例如这个方法。 function getAllOrderedBy($column) { $qb = $this->createQueryBui
我在 symfony 框架的上下文中提问。 我想知道这是否是使用魔法查找方法(如 find($id)、findByField($value) 等...)的好习惯。 那些方法既没有返回类型也没有定义。这
为什么我需要在我的存储库中扩展 ServiceEntityRepository? 在 Symfony 3.4 中,我总是扩展 EntityRepository。使用 ServiceEntityRepo
有没有一种方法可以根据特定条件对 Doctrine 2 EntityRepository 对象进行排序,或者如果我想传递特定的排序参数,是否必须使用 DQL 查询? 最佳答案 您可以通过将第二个参数传
有没有一种方法可以根据特定条件对 Doctrine 2 EntityRepository 对象进行排序,或者如果我想传递特定的排序参数,是否必须使用 DQL 查询? 最佳答案 您可以通过将第二个参数传
我在 parameters.ini 中设置了一个变量,但现在我想从 EntityRepository 中检索该变量,而 $this->container 未设置,所以我不能这样做 我应该如何到达容器?
我想知道在 EntityRepository 类中注入(inject) EventDispatcher 的最佳实践是什么。 最佳答案 首先,使用 global 是一个 very bad practic
namespace griffin\UserBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity(repositoryC
对于 Symfony2 项目,我必须在博客文章和所谓的平台之间建立关系。平台根据您用于查看站点的域定义特定过滤器。例如:如果您通过 url first-example.com 加入该站点,该站点将仅提
我正在尝试创建服务: groupRepository = $groupRepository; // $this->groupUserRepository = $groupUserRep
我正在尝试使用 FOSOAuthServerBundle 在我的实际 symfony2 项目中实现 OAuth2。 我一直在关注这个Article来实现它。 由于我不使用 FOS 用户 bundle
我是一名优秀的程序员,十分优秀!