我们需要配置一个监听器来检查数据库中的一些寄存器,但我们需要在一个包中为每个操作执行此检查操作。
我们不希望每次在bundle中编写函数时调用函数,所以我们想要做一个监听器。
Symfony是否允许仅在一个捆绑包中配置侦听器?
感谢。
答案 0 :(得分:4)
你正在考虑这个错误。您无法配置要为捆绑执行的侦听器。在实践中,侦听器只是等待其事件被触发 - 这是定义何时调用侦听器的事件。您真正想要实现的是在控制器中的每个操作之前触发事件。
你可以这样购买侦听kernel.Controller事件然后做这样的事情:
$controller = $event->getController();
if ($controller instanceof mybundlecontroller) {
// fire custom event e.g. My.db.lookup
}
$event->setController($controller)
在这种情况下,您可以拥有一个单独的侦听器。
请参阅文档:http://symfony.com/doc/current/book/internals.html#kernel-controller-event
答案 1 :(得分:0)
我的情况......我使用event.controller,路由帮助我'使用自定义路由的监听器'
服务
kernel.listener.corporation.manage:
class: Site\CorporationBundle\Event\SiteCorporationManageListener
arguments: ["@doctrine.orm.entity_manager"]
tags:
- { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
类
class SiteCorporationManageListener
{
private $oEntityManager = null;
public function __construct(EntityManager $oEntityManager)
{
$this->oEntityManager = $oEntityManager;
}
public function onKernelController(FilterControllerEvent $event)
{
if (HttpKernelInterface::MASTER_REQUEST === $event->getRequestType()) {
// get variable from url if needed
// $event->getRequest()->get('urlVariable', null);
$route = $event->getRequest()->get('_route');
if (strstr($route, 'corporation')) {
if (!strstr($route, 'corporation_index')) {
echo 'some request done';
}
}
}
}
}
路线
corporation_index_default:
# . . .
corporation_api_default:
# . . .
corporation_manage_default:
# . . .
在我们的案例中,监听器只能在
中使用corporation_api_default:
# . . .
corporation_manage_default:
# . . .