Как получить объект Request из ServiceManger в Zend Framework 2?
Я разрабатываю приложение 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
объект на этом месте?
2 ответа
Краткий ответ: запрос зарегистрирован как Request
:
$request = $serviceManager->get('Request');
Однако то, что вы стремитесь достичь, не принадлежит фабрикам менеджера сервисов. Это контекстно-зависимая фабрика, необходимая в домене контроллера. Поэтому я бы создал это как плагин контроллера.
И если честно, эта функция уже доступна в 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
,
Создание и регистрация альтернативных стратегий рендеринга и реагирования
http://framework.zend.com/manual/2.0/en/modules/zend.view.quick-start.html