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

问题描述:

我开发RESTful应用程序和我想建立一个工厂,创建适当的ViewModelZend\View\Model\ViewModelZend\View\Model\JsonModel,我的XmlModel)对象依赖于HTTP请求报头中的Accept(例如-H 'Accept: application/json')参数。我想实现这个作为回调:如何从Zend Framework 2中的ServiceManger获取Request对象?

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) { 
      ... 
     } 
    } 

... 

} 

我怎样才能得到Request对象在这个地方?

答案很简单:请求注册为Request

$request = $serviceManager->get('Request'); 

不过,你的目标是实现并不是一件属于服务管理器的工厂。它是控制器域中所需的与上下文相关的工厂。因此,我会创建一个控制器插件。

并坦率地说,这个功能是ZF2已经可以通过一个叫做acceptableViewModelSelector现有控制器插件。一个例子是可用at the manual但这将是你的情况的情景:

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); 
    } 
} 

然后你会得到无论是JsonModelXmlModel或默认的ViewModel

+0

太好了!非常感谢您的回答!还有一个问题:关于“接受”值没有预期的是什么?我只是试着'应用程序/ foobar'出来,并得到了'的Zend \查看\型号\ ViewModel'对象和'的Zend \查看\异常\ RuntimeException'(在'/供应商/ ZF2 /库/的Zend /查看抛出/渲染/ PhpRenderer.php:499')。如果HTTP请求头包含不正确的“Access”值,应如何处理这些案例? – automatix

+0

@automatix我认为这是一个不同的问题,但这里是:1)默认情况下,你会得到一个ViewModel,如果找不到合适的匹配的话。这是你想要的,对吧? 2)什么是例外,为什么抛出?你能澄清吗? –

+0

@automatix我现在看到异常,它是关于无法找到的模板。如果你返回一个'ViewModel',那么带有phtml文件的渲染就会在响应中返回html。因此,返回视图模型意味着您需要渲染一个模板。你可以改变行为而不是返回一个标准的ViewModel,但是例如标准的你返回一个JSON模型。那是你需要的吗? –

+0

谢谢!是的,这似乎也是一个很好的解决方案。但是与上面相同的问题:如何处理HTTP请求头包含不正确的Access值的情况? – automatix

+1

不知道我是否正确理解你的问题,但我会试一试。在你的module.config.php中添加key'strategies'=> array('ViewJsonStrategy')。那么你的模块现在知道不要为返回的任何JsonModel使用视图脚本。检查博客http://spabby.github.io/zend-framework-2-REST/ – Haver