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

时间:2013-05-22 12:16:42

标签: rest zend-framework2

在扩展RestController的{​​{1}}中,我可以在已实现的函数中获取路径参数,例如......

AbstractRestfulController

...但是当我在像

这样的构造函数中做同样的事情时
public function create($data)
{
    $entity = $this->params()->fromRoute('entity');
}

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

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


我想做什么

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

2 个答案:

答案 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)

由于路线与特定动作匹配,因此没有任何意义。

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

如果你想知道你想做什么,那么我可以建议一个更好/更好的方法来做它