如何从Zend Framework 2中的ServiceManger获取Request对象?
问题描述:
我开发RESTful应用程序和我想建立一个工厂,创建适当的ViewModel
(Zend\View\Model\ViewModel
,Zend\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);
}
}
然后你会得到无论是JsonModel
,XmlModel
或默认的ViewModel
。
答
太好了!非常感谢您的回答!还有一个问题:关于“接受”值没有预期的是什么?我只是试着'应用程序/ foobar'出来,并得到了'的Zend \查看\型号\ ViewModel'对象和'的Zend \查看\异常\ RuntimeException'(在'/供应商/ ZF2 /库/的Zend /查看抛出/渲染/ PhpRenderer.php:499')。如果HTTP请求头包含不正确的“Access”值,应如何处理这些案例? – automatix
@automatix我认为这是一个不同的问题,但这里是:1)默认情况下,你会得到一个ViewModel,如果找不到合适的匹配的话。这是你想要的,对吧? 2)什么是例外,为什么抛出?你能澄清吗? –
@automatix我现在看到异常,它是关于无法找到的模板。如果你返回一个'ViewModel',那么带有phtml文件的渲染就会在响应中返回html。因此,返回视图模型意味着您需要渲染一个模板。你可以改变行为而不是返回一个标准的ViewModel,但是例如标准的你返回一个JSON模型。那是你需要的吗? –