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.