2013-06-18 2 views
3

Я занимаюсь разработкой RESTful приложения, и я хочу, чтобы построить завод, который создает надлежащую ViewModel (Zend\View\Model\ViewModel, Zend\View\Model\JsonModel, мой XmlModel) объект, зависящий от (например -H 'Accept: application/json') параметра в заголовке запроса HTTP Accept. Я хочу, чтобы реализовать это как обратный вызов:Как получить объект Request из ServiceManger в Zend Framework 2?

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 объект в этом месте?

ответ

13

Короткий ответ: запрос регистрируются как 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.

+0

Отлично! Большое спасибо за ваш ответ! Еще один вопрос: что можно сказать о ожидаемых значениях 'Accept'? Я просто попробовал «application/foobar» и получил объект «Zend \ View \ Model \ ViewModel» и «Zend \ View \ Exception \ RuntimeException» (брошенный в '/ vendor/ZF2/library/Zend/View/Renderer/PhpRenderer.php: 499'). Как следует обрабатывать случаи, когда заголовок HTTP-запроса содержит неправильное значение 'Access'? – automatix

+0

@automatix Я думаю, что это другой вопрос, но здесь он гласит: 1) вы получаете ViewModel по умолчанию, если не найдено подходящего соответствия. Это то, что вы хотите, не так ли? И 2) Какое исключение и почему оно брошено? Вы можете уточнить? –

+0

@automatix Теперь я вижу исключение, речь идет о шаблоне, который не может быть найден. Если вы вернете «ViewModel», то рендеринг с файлом phtml будет сделан для возврата html в ответ. Таким образом, возврат модели просмотра означает, что вам нужен шаблон для визуализации. Вы можете изменить поведение, чтобы не возвращать стандартный ViewModel, но, например, стандарт, вы возвращаете модель JSON. Это то, что вам нужно? –

2

Создание и регистрация Альтернативные визуализации и стратегий реагирования

http://framework.zend.com/manual/2.0/en/modules/zend.view.quick-start.html#creating-and-registering-alternate-rendering-and-response-strategies

+0

Спасибо! Да, это тоже кажется хорошим решением. Но тот же вопрос, что и выше: как обрабатывать случаи, когда заголовок HTTP-запроса содержит недопустимое значение Access? – automatix

+1

Не уверен, что я правильно понимаю вас, но я попробую. В вас module.config.php добавьте ключ «стратегии» => массив («ViewJsonStrategy»). то ваш модуль теперь не может использовать сценарий вида для любых возвращенных JsonModels. проверьте блог http://spabby.github.io/zend-framework-2-REST/ – Haver