在扩展RestController
的{{1}}中,我可以在已实现的函数中获取路径参数,例如......
AbstractRestfulController
...但是当我在像
这样的构造函数中做同样的事情时public function create($data)
{
$entity = $this->params()->fromRoute('entity');
}
我得到public function __construct()
{
$entity = $this->params()->fromRoute('entity');
}
。
为什么?如何在构造函数中获取路径参数?
由于我正在尝试创建一个通用控制器,因此所有操作(resp.verbs)共享一部分restful路由。发出请求的实体。为方便起见,我想将它存储在类参数中。
答案 0 :(得分:2)
通常你会编写一个方法来代理你需要的任何值,只要调用那个方法,调用$this->getEntity()
只比调用$this->entity
要贵一点,据我所知,是明确的目标
class RestController
{
protected $entity;
public function getEntity()
{
if (!$this->entity) {
$this->entity = $this->params()->fromRoute('entity');
}
return $this->entity;
}
}
如果您确实想要预先填充实体属性,最简单的方法是使用初始值设定项,并将代码从__construct
移动到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
}
}
答案 1 :(得分:0)
由于路线与特定动作匹配,因此没有任何意义。
您无法路由到构造函数,因此如何在那里获取路径参数?
如果你想知道你想做什么,那么我可以建议一个更好/更好的方法来做它