2011-07-01 67 views
4

我讀過一些地方,使用一個基本控制器是壞的,並有更多的側面比側面。那個人說你應該使用插件。Zend中底層控制器的下側是什麼?

我需要的是每個動作從請求中獲得「lang」變量並將其傳遞給當前動作。我現在所做的就是用preDispatch製作一個基本控制器,它可以從請求中獲取並通過$this(任何其他控制器從基礎擴展)傳遞它。

如果我使用插件,應該如何實現它?我應該嗎?

編輯: 找到我已經讀過的地方控制器是邪惡的地方:Sending variables to the layout in Zend Framework評論最後回答。注意我的問題並不相似(我需要傳遞給一個動作,而不是佈局)。

EDIT2: 有關如何實現的答案,您是否還可以解釋爲什麼使用基本控制器不好?編號3: 似乎無法使其工作。我已經完成了:在控制器文件夾中創建了一個助手目錄,添加到初始化程序中Zend_Controller_Action_HelperBroker::addPath('../application/default/controllers/helpers/', 'Controller_Helper'); 在該文件夾中創建了一個名爲LangHelper.php的文件,並創建了一個類Controller_Helper_Lang extends Zend_Controller_Action_Helper_Abstract。爲什麼它還沒有工作? (也許我需要添加一個需要一次或某事?)

EDIT4: 我得到的是:

Zend_Loader_PluginLoader_Exception:按名稱插件「郎」在註冊表中沒有發現 ;使用路徑:Controller_Helper_: ../application/default/controllers/helpers/;../application/admin/controllers/helpers/ Zend_Controller_Action_Helper_:Zend/Controller/Action/Helper/in C:\ wamp \ www \ EfCom \ library \ Zend \ Loader \ PluginLoader.php on line 412

回答

2

您應該使用Action Helpers而不是插件。

通過這種方式,您可以執行例如$this->_helper->getLang()以獲取您的動作中的lang(其中GetLang是您的Action Helper),而不是使用類屬性。

插件可用於控制請求的路由(例如添加ACL過濾)。這不是你想要在這裏做的。爲你的助手

示例代碼:

class MyModule_Controller_Helper_GetLang extends Zend_Controller_Action_Helper_Abstract { 
    /** 
    * direct() is the default method called 
    * when you use $this->_helper->getLang() 
    */ 
    public function direct() { 
     $lang = /*get you lang here*/; 
     return $lang; 
    } 
} 

教程:

我建議把你的傭工/應用/控制器/幫手。請參閱directory layout的官方建議。他們說:

控制器/助理/ - 這些目錄將包含動作助手。動作助手的命名空間可以是默認模塊的「Controller_Helper_」,也可以是其他模塊的「Controller_Helper」。

更新:
我用了一個基本的控制器寂寂動作助手,完成該工作之前,但可以說是助手恰好有針對。這是一個爲你想做什麼而創建的概念,有一些優點(比如延遲加載,所以只有當你使用它時才加載幫助器)。想象一下,在一週內你需要添加另一個變量,但只需要在一些頁面中,而不是全部。使用基本控制器時,這些變量會每次加載。你應該學習如何正確地做(使用助手),以便以後充分使用它。這將讓你的代碼乾淨整潔。 控制器只是一個控制器,幫手只是幫手

+0

你能寫出如何在我的情況下使用這個? – Vadiklk

+0

@Vladiklk我更新了我的答案,你明白我的意思了嗎? –

+0

你對基本控制器的想法有什麼看法? – Vadiklk