php – Zend中基本控制器的缺点是什么?

我在某处读过,使用基本控制器是坏的,并且有更多的下侧而不是上侧.那个人说你应该使用插件.

我需要的是在每个动作从请求获得“lang”变量并将其传递给当前动作之前.我现在所做的是制作一个带有preDispatch的基本控制器,它从请求中获取它并将其传递给$this(任何其他控制器从基础扩展).

如果我使用插件,我应该如何实现它?我应该吗?

编辑:
找到我读过基本控制器是邪恶的地方:Sending variables to the layout in Zend Framework评论最后的答案.请注意我的问题不相似(我需要传递给一个动作,而不是布局).

EDIT2:
有了如何实现的答案,您是否还可以解释为什么使用基本控制器不好?

EDIT3:
似乎无法使其发挥作用.我已经完成了:在controllers文件夹中创建了一个helper dir,在初始化程序中添加了Zend_Controller_Action_HelperBroker :: addPath(‘../ application / default / controllers / helpers /’,’Controller_Helper’);
在该文件夹中创建了一个名为LangHelper.php的文件并创建了一个类Controller_Helper_Lang扩展了Zend_Controller_Action_Helper_Abstract.它为什么还不起作用? (也许我需要添加一次或什么?)

EDIT4:
我得到的是:

Zend_Loader_PluginLoader_Exception: Plugin by name ‘Lang’ was not
found in the registry; used paths: 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

最佳答案 你应该使用
Action Helpers而不是插件.

这样,你可以做例如$this-> _helper-> getLang()来获取动作中的lang(使用GetLang作为你的Action Helper),而不是使用class属性.

插件可用于控制请求的路由(例如,添加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;
    }
}

教程:

> http://www.phpbuilder.com/columns/zend-action-helpers/Jason_Gilmore091410.php3
> http://tournasdimitrios1.wordpress.com/2011/04/24/zend-framework-a-basic-example-of-zend-controller-action-helper/

我建议把你的助手放在/ application / controllers / helpers中.查看directory layout的官方建议.他们说:

controllers/helpers/ – These directories will contain action helpers. Action helpers will be namespaced either as “Controller_Helper_” for the default module or “Controller_Helper” in other modules.

更新:
在了解行动助手之前,我已经使用了一个基本控制器,这可以完成工作,但是让我们说帮助者就是那样.这是一个完全根据您的想法创建的概念,具有一些优点(例如延迟加载,因此只有在您使用帮助程序时才加载帮助程序).想象一下,你需要在一周内添加另一个变量,但只需要在某些页面中,而不是全部.使用基本控制器,每次都会加载这些变量.你应该学习如何正确地做(使用助手),以便以后可以完全使用它.这将使您的代码清洁有序.控制器只是一个控制器,帮手只是一个帮手.

点赞