在RESTful控制器中获取路由参数

在RESTful控制器中获取路由参数,rest,zend-framework2,Rest,Zend Framework2,在扩展了AbstractRestfulController的我的RestController中,我可以在实现的函数中获取路由参数,例如 public function create($data) { $entity = $this->params()->fromRoute('entity'); } 。。。但是当我在构造函数中这样做的时候 public function __construct() { $entity = $this->params()->

在扩展了
AbstractRestfulController
的我的
RestController
中,我可以在实现的函数中获取路由参数,例如

public function create($data)
{
    $entity = $this->params()->fromRoute('entity');
}
。。。但是当我在构造函数中这样做的时候

public function __construct()
{
    $entity = $this->params()->fromRoute('entity');
}
我在非对象上调用成员函数getParam()

为什么呢?如何在构造函数中获取路由参数


我想做什么
因为我试图创建一个通用控制器,所以restful路由的一部分是为所有动作(分别是动词)共享的。为其发出请求的实体。为了方便起见,我想将其存储在类参数中。

这没有任何意义,因为路由与特定操作匹配

您无法路由到构造函数,因此如何在那里获取路由参数


如果你想知道你想做什么,那么我可以建议一种更好/更好的方法。通常你会编写一个方法来代理你需要的任何值,然后调用该方法,调用
$this->getEntity()
只比调用
$this->entity
稍微贵一点,据我所知,这是既定的目标

如果确实要预填充实体属性,最简单的方法是使用初始值设定项,并将代码从
\uu构造中移动到
init()
。让控制器实现
\Zend\Stdlib\InitializableInterface

use Zend\Stdlib\InitializableInterface;

class RestController extends AbstractRestfulController implements InitializableInterface
{
    protected $entity;

    public function init() {
        $this->entity = $this->params()->fromRoute('entity');
    }
}
向模块boostrap中的控制器加载程序添加初始值设定项

use Zend\Stdlib\InitializableInterface;

class Module
{
    public function onBootstrap(MvcEvent $e)

        $sm = $e->getApplication()->getServiceManager();

        $controllers = $sm->get('ControllerLoader');            

        $controllers->addInitializer(function($controller, $cl) {
            if ($controller instanceof InitializableInterface) {
                $controller->init();
            }
        }, false); // false tells the loader to run this initializer after all others
    }
} 

当调用
\uu构造时,没有注入任何组件,或者在控制器管理器初始化控制器后发生。你想做什么?请看我的编辑…编辑并没有让事情变得更清楚。您试图在构造函数中将
实体
参数分配给的
$entity
具体要做什么?不,正如我所写的,我想将其存储为类字段。我很高兴知道一种更好的方法来完成我试图做的事情:)ZF2非常复杂。。。我真的开始越来越多地认为它已经越过了工程学的门槛,不再对凡人有用了,尤其是在缺乏详细文档的情况下。
use Zend\Stdlib\InitializableInterface;

class Module
{
    public function onBootstrap(MvcEvent $e)

        $sm = $e->getApplication()->getServiceManager();

        $controllers = $sm->get('ControllerLoader');            

        $controllers->addInitializer(function($controller, $cl) {
            if ($controller instanceof InitializableInterface) {
                $controller->init();
            }
        }, false); // false tells the loader to run this initializer after all others
    }
}