2013-06-18 43 views
3

我開發RESTful應用程序和我想建立一個工廠,創建適當的ViewModelZend\View\Model\ViewModelZend\View\Model\JsonModel,我的XmlModel)對象依賴於HTTP請求報頭中的Accept(例如-H 'Accept: application/json')參數。我想實現這個作爲回調:如何從Zend Framework 2中的ServiceManger獲取Request對象?

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); 
    } 
} 

然後你會得到無論是JsonModelXmlModel或默認的ViewModel

+0

太好了!非常感謝您的回答!還有一個問題:關於「接受」值沒有預期的是什麼?我只是試着'應用程序/ foobar'出來,並得到了'的Zend \查看\型號\ ViewModel'對象和'的Zend \查看\異常\ RuntimeException'(在'/供應商/ ZF2 /庫/的Zend /查看拋出/渲染/ PhpRenderer.php:499')。如果HTTP請求頭包含不正確的「Access」值,應如何處理這些案例? – automatix

+0

@automatix我認爲這是一個不同的問題,但這裏是:1)默認情況下,你會得到一個ViewModel,如果找不到合適的匹配的話。這是你想要的,對吧? 2)什麼是例外,爲什麼拋出?你能澄清嗎? –

+0

@automatix我現在看到異常,它是關於無法找到的模板。如果你返回一個'ViewModel',那麼帶有phtml文件的渲染就會在響應中返回html。因此,返回視圖模型意味着您需要渲染一個模板。你可以改變行爲而不是返回一個標準的ViewModel,但是例如標準的你返回一個JSON模型。那是你需要的嗎? –

2
+0

謝謝!是的,這似乎也是一個很好的解決方案。但是與上面相同的問題:如何處理HTTP請求頭包含不正確的Access值的情況? – automatix

+1

不知道我是否正確理解你的問題,但我會試一試。在你的module.config.php中添加key'strategies'=> array('ViewJsonStrategy')。那麼你的模塊現在知道不要爲返回的任何JsonModel使用視圖腳本。檢查博客http://spabby.github.io/zend-framework-2-REST/ – Haver

相關問題