如何从Zend Framework 2中的ServiceManger获取Request对象?

aut*_*tix 3 rest request zend-framework2 servicemanager

我正在开发一个RESTful应用程序,我想建立一个工厂,创建正确的ViewModel(Zend\View\Model\ViewModel,Zend\View\Model\JsonModel,我的XmlModel)对象取决于Accept(例如-H 'Accept: application/json'HTTP请求头)参数.我想将其作为回调来实现:

class Module implements ServiceProviderInterface
{

...

    public function getServiceConfig() {
        try {
            return array (
                'factories' => array(
                    'RestViewModel' => function($serviceManager) {
                        // Here I need the the Request object.
                        $requestHeadAccept = $requestObject->getHeaders()->get('Accept')->toString();
                        $return = null;
                        if (strpos($requestHeadAccept, 'application/json') != -1) {
                            $return = new JsonModel(array('data' => $data));
                        } elseif (strpos($requestHeadAccept, 'application/xml') != -1) {
                            ...
                        } else {
                            ...
                        }
                        return $return;
                    }
                )
            );
        } catch (\Exception $e) {
            ...
        }
    }

...

}
Run Code Online (Sandbox Code Playgroud)

我怎样才能Request在这个地方找到物体?

Jur*_*man 14

简答:请求注册为Request:

$request = $serviceManager->get('Request');
Run Code Online (Sandbox Code Playgroud)

但是,您要实现的目标不是属于服务经理工厂的部分.它是控制器域中所需的上下文相关工厂.因此,我会创建一个作为控制器插件.

说实话,这个功能已经通过现有的控制器插件在ZF2中可用acceptableViewModelSelector.手册中提供一个示例,但这可能是您的情况:

use Zend\Mvc\Controller\AbstractActionController;

class SomeController extends AbstractActionController
{
   protected $acceptCriteria = array(
      'Zend\View\Model\JsonModel' => array(
         'application/json',
      ),
      'My\View\XmlModel' => array(
         'application/xml',
      ),
   );

   public function apiAction()
   {
      $model = $this->acceptableViewModelSelector($this->acceptCriteria);
   }
}
Run Code Online (Sandbox Code Playgroud)

然后你会得到一个JsonModel,XmlModel或默认情况下ViewModel.