Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 自定义过滤器/钩子/事件监听器-如何?_Php_Oop_Symfony - Fatal编程技术网

Php 自定义过滤器/钩子/事件监听器-如何?

Php 自定义过滤器/钩子/事件监听器-如何?,php,oop,symfony,Php,Oop,Symfony,我希望实现: 听myController->myAction()和 调用myService->myModification()(之前) 过滤/修改$item(listenToMyFilterBefore/listenToMyFilterAfter) 下面是伪代码。似乎是和的混合体。什么是好的做法 class myController() { public function myAction() { $item = new Item();

我希望实现:

  • myController->myAction()
  • 调用
    myService->myModification()
    (之前)
  • 过滤/修改
    $item
    listenToMyFilterBefore
    /
    listenToMyFilterAfter
下面是伪代码。似乎是和的混合体。什么是好的做法

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');
        });
    }
}

谢谢

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

也适用于FrameworkExtraBundle。它将帮助您在控制器代码之前获取项目的实例。您的侦听器可以在ExtraListeners之后立即获取

控制器不必返回
响应
实例。如果您将返回
,则将调度
内核事件::视图
事件。您可以在相应的侦听器中处理
,并返回
响应
。查找类似楼层的
FOSRestBundle
viewsresponselistner

如果这还不够,您还可以应用
AOP
方法。

使myService成为一项服务:并从您的控制器访问它。