Rest 如何从Zend Framework 2中的ServiceManger获取请求对象?

Rest 如何从Zend Framework 2中的ServiceManger获取请求对象?,rest,request,zend-framework2,servicemanager,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 functi

我正在开发一个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) {
            ...
        }
    }

...

}

如何在此处获取
请求
对象?

简短回答:请求注册为
请求

$request = $serviceManager->get('Request');
但是,您的目标并不是服务经理的工厂。它是控制器域中所需的上下文相关工厂。因此,我将创建is作为控制器插件

老实说,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);
   }
}

然后,您将获得一个
JsonModel
XmlModel
,或者默认情况下,
ViewModel
,创建并注册备用呈现和响应策略


太好了!非常感谢您的回答!还有一个问题:什么是不期望的
Accept
值?我刚刚尝试了
application/foobar
,得到了一个
Zend\View\Model\ViewModel
对象和一个
Zend\View\Exception\RuntimeException
(抛出
/vendor/ZF2/library/Zend/View/Renderer/PhpRenderer.php:499
)。当HTTP请求头包含不正确的
Access
值时,应该如何处理这些情况?@automatix我认为这是一个不同的问题,但问题是:1)当找不到正确的匹配项时,默认情况下会得到一个ViewModel。这就是你想要的,对吗?2)异常是什么,为什么抛出它?你能澄清一下吗?@automatix我现在看到了例外,是关于找不到的模板。如果返回
ViewModel
,则使用phtml文件进行渲染以在响应中返回html。因此,返回视图模型意味着您需要渲染一个模板。您可以改变行为以不返回标准的ViewModel,但例如,您可以返回一个JSON模型。这就是你需要的吗?谢谢!是的,这似乎也是一个很好的解决方案。但与上面相同的问题是:当HTTP请求头包含不正确的访问值时,如何处理这种情况?不确定我是否正确理解您的问题,但我会尝试一下。在module.config.php中添加键'strategies'=>array('ViewJsonStrategy')。然后,您的模块现在知道不要对返回的任何JSONModel使用视图脚本。查看博客