Symfony:自定义过滤器/ hook / eventlistener - 如何?

时间:2014-12-01 14:09:03

标签: php oop symfony

我想实现:

  • 收听myController->myAction()
  • 致电myService->myModification()(之前)
  • 过滤/修改$itemlistenToMyFilterBefore / listenToMyFilterAfter

下面的伪代码。似乎是event listeningfiltering的混合。什么是好的做法?

class myController() {
    public function myAction() {
        $item = new Item();          
        $item = registerFilter('listenToMyFilterBefore', $item); // possibility to prepare before

        // ... some modification ...

        $item = registerFilter('listenToMyFilterAfter', $item); // possibility to modify after

        // ...
    }
}

class myService {
    public function myModification() {
        // listen to "myController->myAction"

        $item = filter('listenToMyFilterBefore', function($item) {
            $item->setLockMe(true);
        });

        $item = filter('listenToMyFilterBefore', function($item) {
            $item->setLockMe(false);
            $item->setSomeValue('myValue');
        });
    }
}

谢谢!

1 个答案:

答案 0 :(得分:2)

我认为标准的Symfony2事件适合您的需求:侦听器KernelEvents::CONTROLLER在控制器执行之前调用,KernelEvents::VIEW调用之后。

同样适用于FrameworkExtraBundle。它应该可以帮助您在控制器代码之前获取Item的实例。可以在ExtraListeners之后立即获取您的侦听器。

Controller没有义务返回Response实例。如果您将返回Item,则会调度KernelEvents::VIEW事件。您可以在相应的侦听器中处理Item并返回Response。寻找类似楼层的FOSRestBundleViewResponseListnerhttps://github.com/FriendsOfSymfony/FOSRestBundle

如果这还不够,您也可以申请AOP方法。 http://jmsyst.com/bundles/JMSAopBundle