4

我正在开发一个 RESTful 应用程序,我想构建一个工厂,它根据HTTP 请求标头中的(eg ) 参数创建正确的ViewModel( Zend\View\Model\ViewModel, Zend\View\Model\JsonModel, my XmlModel) 对象。我想将此实现为回调:Accept-H 'Accept: application/json'

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在这个地方得到对象?

4

2 回答 2

15

简短的回答:请求注册为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);
   }
}

然后你会得到一个JsonModelXmlModel或者默认情况下ViewModel.

于 2013-06-18T12:25:46.740 回答
2

创建和注册备用渲染和响应策略

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

于 2013-06-18T15:07:47.040 回答