2017-05-05 39 views
0

我在控制器中的所有action()上都有這兩行,所以我想將它移動到init(),以便每次調用它。它不工作,所以我試圖__construct,它不會工作,因爲它說「PHP的致命錯誤:未捕獲的錯誤:調用成員函數get()null」ZF 2.4 - 控制器 - 替代init()?

也許可以在工廠和你仍然在工廠類中調用getServiceLocator?如果我可以在控制器內部做到這一點,那會更好,因爲這不是一件容易的事情,而且可以在控制器中做到這一點,所以每一個動作都會有這樣的動作?

$view_helper = $this->getServiceLocator()->get('viewhelpermanager'); 
    $view_helper->get('headScript')->appendFile(....); 
+0

那麼,爲什麼你要在你的控制器中添加一個標題文件,而不是從佈局或其他視圖文件中添加標題文件。並且在追加文件之前需要檢查一些事情,創建一個viewHelper誰來幫助你完成這項工作,以保持你的視圖乾淨整潔? – Kwido

+0

因爲我有很多控制器,每個控制器都有很多操作。我有js文件,並非所有控制器都需要,所以不應該將其放入佈局中。然後我有很多操作使用相同的js文件。如果我需要更改一個js文件,那麼我可以在一個地方改變它,而不是許多更好的視圖文件。 – sparkmix

+0

我正在尋找一種解決方案,我可以做我所提到的,而不是在不同的視圖上反覆放置相同的js文件。如果我需要指向一個不同的js文件,那需要時間。 – sparkmix

回答

0

只有兩個解決方案存在:

  1. 你可以做一個抽象的控制器,並使用viewhelpermanager在你的構造函數依賴。這意味着您將需要在所有子類工廠中傳遞viewhelpermanager,並且在創建對象時不要忘記調用父構造等等。

  2. 您可以在服務管理器,幷包含setViewHelperManager方法和viewhelpermanager的抽象控制器使用委託人(或最壞,性狀:)和ViewHelperManagerAwareInterface和初始化),並做了「軟依賴」,但在維護(代碼可讀性)方面,這是一種錯誤的做法。

0

你爲什麼不寫你自己的視圖助手,並使其包括js文件。然後你可以在需要這些文件的所有view.phtml文件中使用它。如果您需要更改/添加/刪除js文件,那麼只需在您的視圖幫助器中執行此操作,顯然,此更改將反映在您使用它的所有視圖中。

這可以讓視圖遠離控制器。

希望這會有所幫助。