1

在我的RestControllerwhich extendsAbstractRestfulController中,我可以在已实现的函数中获取路由参数,例如...

public function create($data)
{
    $entity = $this->params()->fromRoute('entity');
}

...但是当我像这样在构造函数中做同样的事情时

public function __construct()
{
    $entity = $this->params()->fromRoute('entity');
}

我明白了Call to a member function getParam() on a non-object

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


我想要做什么

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

4

2 回答 2

2

通常,您会编写一个方法来代理您需要的任何值,然后调用该方法,调用$this->getEntity()它只比调用贵一点$this->entity,据我所知,这是既定目标

class RestController 
{
    protected $entity;

    public function getEntity()
    {
        if (!$this->entity) {
            $this->entity = $this->params()->fromRoute('entity');
        }
        return $this->entity;
    }
}

如果您确实想预先填充实体属性,最简单的方法是使用初始化程序,并将代码从您的__constructor 移动到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
    }
} 
于 2013-05-22T13:34:31.663 回答
0

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

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

如果您对您正在尝试做的事情有所了解,那么我可以建议一种更好/更好的方法来做到这一点

于 2013-05-22T12:25:59.917 回答