2012-11-01 61 views

回答

1

有兩個選項,您沒有在您的插件中設置控制器。

  1. 你打電話從插件管理器分發之前的插件,所以沒有控制器設置尚未
  2. 您在__construct()

這是第一個,一個典型的例子調用插件內的控制器是onBootstrap()方法的模塊類很明顯,您有沒有控制器:

public function onBootstrap($e) 
{ 
    $app = $e->getApplication(); 
    $sm = $app->getServiceManager(); 

    $plugins = $sm->get('ControllerPluginManager'); 
    $plugin = $plugins->get('my-plugin'); 

    // $plugin->getController() === null 
} 

這似乎是一個明顯的例子,但在其他情況下,您錯誤地認爲控制器已存在(例如,在應用程序運行期間,在路徑階段;派遣仍然要到)。

第二個例子是因爲控制器注入了setter注入。施工人員在施工後被調用。在僞代碼,出現這種情況:

$plugin = new $class; 
$plugin->setController($controller); 

如果你有一個這樣的插件:

use Zend\Mvc\Controller\Plugin\AbstractPlugin; 

class MyPlugin extends AbstractPlugin 
{ 
    public function __construct() 
    { 
    // $this->getController() === null 
    } 
} 

你注意到沒有控制器設置在那個階段。

2

請注意,這個答案是基於我對ZF1的經驗,並快速瀏覽了ZF2代碼。檢出this answer

我還沒有ZF2玩過沒,但如果調度程序和插件類似於ZF1,插件無法訪問控制器(至少不是一個平凡的方式)作爲控制器甚至不爲一些插件鉤子實例化。

更新:剛剛看了一下一些股票ZF2控制器插件(如我似乎無法找到創建自定義插件的官方文檔),看看檢查like the following

$controller = $this->getController(); 
if (!$controller || !method_exists($controller, 'plugin')) { 
//... 

因此,在某些情況下似乎可能不會設置控制器。由於插件也支持(我所理解的)一個事件監聽器,我的猜測是,他們仍然可以在響應過程中的不同時間使用,這可能在分配控制器之前。

希望someone who's used ZF2 can come along and set me straight;但也許我至少已經指出你有一個合理的方向。

+0

ZF2中沒有插件鉤子,也沒有「調度階段」。因此,我打算回答投票的答案,但我認爲最好先評論一下。確實,你可以在沒有控制器的情況下訪問一個插件,但其餘的有點廢話。 –

+0

@JurianSluiman所以你說的是一個插件*不能*在動作發佈前影響事物?術語可能已經從ZF1插件發生了變化,但它看起來像(在控制器之前被實例化的插件的)概念是有效的(實際上,根據您的答案)。 –

+0

控制器插件與ZF1的工作方式不同。沒有preDispatch/routeStartup等等。插件可以從控制器內部調用,但不會在應用程序的特定階段執行。這些階段被事件管理器取代,這使得某些動作的觸發更爲靈活。當然,您可以將偵聽器添加到調用控制器插件的應用程序事件中,但這完全由開發人員決定。 –

相關問題