Как получить объект 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

Другие вопросы по тегам