Symfony:自定义过滤器/钩子/事件监听器 - 如何实现?

3
我希望实现以下内容:
  • 监听myController->myAction()
  • 在调用myService->myModification()之前
  • $item进行过滤/修改(listenToMyFilterBefore/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');
        });
    }
}

谢谢!


将myService变成一个服务:http://symfony.com/doc/current/book/service_container.html 并从您的控制器中访问它。 - Cerad
1个回答

2
我认为标准的Symfony2事件适合您的需求:使用监听器KernelEvents :: CONTROLLER在控制器执行之前调用,使用KernelEvents :: VIEW 在执行后调用。
同时也适用于FrameworkExtraBundle。它应该帮助您在控制器代码之前获取Item实例。您的监听器可以在ExtraListeners之后获取。
控制器不必返回Response 实例。如果您返回Item ,则将分派KernelEvents :: VIEW 事件。您可以在相应的监听器中处理Item 并返回Response 。寻找FOSRestBundle ViewResponseListner 以获取类似的内容。 https://github.com/FriendsOfSymfony/FOSRestBundle 如果这还不够,您还可以采用AOP 方法。 http://jmsyst.com/bundles/JMSAopBundle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接