我在zf2中編寫了一個控制器插件。 我使用以下方法從插件中獲取控制器,但它返回null。如何從zendframework 2的控制器插件中獲取控制器?
$controller = $this->getController()
有什麼建議嗎?
我在zf2中編寫了一個控制器插件。 我使用以下方法從插件中獲取控制器,但它返回null。如何從zendframework 2的控制器插件中獲取控制器?
$controller = $this->getController()
有什麼建議嗎?
有兩個選項,您沒有在您的插件中設置控制器。
__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
}
}
你注意到沒有控制器設置在那個階段。
請注意,這個答案是基於我對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;但也許我至少已經指出你有一個合理的方向。
ZF2中沒有插件鉤子,也沒有「調度階段」。因此,我打算回答投票的答案,但我認爲最好先評論一下。確實,你可以在沒有控制器的情況下訪問一個插件,但其餘的有點廢話。 –
@JurianSluiman所以你說的是一個插件*不能*在動作發佈前影響事物?術語可能已經從ZF1插件發生了變化,但它看起來像(在控制器之前被實例化的插件的)概念是有效的(實際上,根據您的答案)。 –
控制器插件與ZF1的工作方式不同。沒有preDispatch/routeStartup等等。插件可以從控制器內部調用,但不會在應用程序的特定階段執行。這些階段被事件管理器取代,這使得某些動作的觸發更爲靈活。當然,您可以將偵聽器添加到調用控制器插件的應用程序事件中,但這完全由開發人員決定。 –