2012-10-05 38 views
2

我有一個應用程序,我們使用AbstractRestfulController和Json策略。 (我們有直接的要求使用這種方法)。所以我們通過jQuery使用jQuery來完成所有的請求。現在我有一個下載存儲在服務器上的pdf文件的特定要求。我想使用php/zend頭文件來下載文件,而不是公開文件的實際http路徑。覆蓋視圖策略的具體操作

是否有任何解決方案,以下這個Restful方法。我正在考慮針對具體行動的覆蓋視圖策略,但不知道如何?

我將有一個使用特定模塊的默認AbstractActionController的最後辦法,並將我的代碼放入。但是,如果它是我唯一的解決方案(因爲將當前模塊特定的代碼移到另一個模塊看起來是個不好的主意)?

+0

看像我一樣少[R &D在這個問題之前。就像在普通的非休息路由器中設置一個簡單的動作一樣,Controller中的相應動作也是如此。因此,我的Restful控制器通過主路由器規則執行兩種操作的REST操作,而通過module.config.php中的自定義路由執行非休息操作。所以不需要對Module.php進行任何更改。 –

回答

3

參見下面添加自己的觀點strategyr的例子,你可以看到在文檔的例子:

http://framework.zend.com/manual/2.0/en/modules/zend.view.quick-start.html

可以很容易地修改這個例子來檢查一個給定的控制器/行動,如果是這樣的方式你想去。

<?php 
namespace Application; 

class Module 
{ 
    public function onBootstrap($e) 
    { 
     // Register a "render" event, at high priority (so it executes prior 
     // to the view attempting to render) 
     $app = $e->getApplication(); 
     $app->getEventManager()->attach('render', array($this, 'registerJsonStrategy'), 100); 
    } 

    public function registerJsonStrategy($e) 
    { 
     $app   = $e->getTarget(); 
     $locator  = $app->getServiceManager(); 
     $view   = $locator->get('Zend\View\View'); 
     $phpStrateogy = $locator->get('PhpRendererStrategy'); 
     // or any you have setup in your config... 
     $jsonStrategy = $locator->get('ViewJsonStrategy'); 

     $routeMatch = $e->getRouteMatch(); 
     /* @var $routeMatch \Zend\Mvc\Router\RouteMatch */ 
     $routeName = $routeMatch->getMatchedRouteName(); 
     if($routeName == 'myroute') { 
      // possible change layout? 
      //$controller->layout('app/layout/new_layout'); 
      // Attach strategy, which is a listener aggregate, at high priority 
      //$view->getEventManager()->attach($jsonStrategy , 100); 
      $view->getEventManager()->attach($phpStrateogy, 1); 
     } 
    } 
} 

或者你可以返回一個不同類型的視圖模型的,如果兩個策略啓用你可以改變你的控制器內返回不同的模型中使用的策略:

public function someAction() 
{ 
    // will use JsonRenderer 
    return new \Zend\View\Model\JsonModel(array('bob')); 

    // Will use PHPRenderer 
    return new \Zend\View\Model\ViewModel(array('bob')); 
} 
+0

我試過你的代碼,但方法registerJsonStrategy從來沒有調用過。我認爲,因爲ViewJsonStrategy已在module.config.php中啓用,所以不會調用渲染事件。 –

+0

這僅僅是一個例子,它並不是按照原樣使用,它只是一個如何添加新策略的例子。 你也可以使用其他事件,比如派遣。 – Andrew

+0

如果已經有一個具有更高優先級的jsonViewStrategy,那麼將首先調用,嘗試使用較小的優先級號碼等。 – Andrew