我想实现:
myController->myAction()
和myService->myModification()
(之前)$item
(listenToMyFilterBefore
/ listenToMyFilterAfter
)下面的伪代码。似乎是event listening和filtering的混合。什么是好的做法?
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');
});
}
}
谢谢!
答案 0 :(得分:2)
我认为标准的Symfony2事件适合您的需求:侦听器KernelEvents::CONTROLLER
在控制器执行之前调用,KernelEvents::VIEW
调用之后。
同样适用于FrameworkExtraBundle。它应该可以帮助您在控制器代码之前获取Item的实例。可以在ExtraListeners之后立即获取您的侦听器。
Controller没有义务返回Response
实例。如果您将返回Item
,则会调度KernelEvents::VIEW
事件。您可以在相应的侦听器中处理Item
并返回Response
。寻找类似楼层的FOSRestBundle
和ViewResponseListner
。
https://github.com/FriendsOfSymfony/FOSRestBundle
如果这还不够,您也可以申请AOP
方法。
http://jmsyst.com/bundles/JMSAopBundle