Rest 如何从Zend Framework 2中的ServiceManger获取请求对象?
我正在开发一个RESTful应用程序,我想建立一个工厂,创建适当的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
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使用视图脚本。查看博客