【问题标题】:ZF2 MVC global functionZF2 MVC 全局函数
【发布时间】:2013-05-08 10:26:11
【问题描述】:

使一个函数/方法对多个控制器的应用程序全局化的最佳做法是什么?

例如,假设我们有一个控制器。这个控制器正在使用一个函数,但我们不想将它复制粘贴到另一个控制器,我们只想调用那个函数。

class ControllerName extends AbstractActionController {
    // Your actions

    // Has to become a call,
    // instead of copy pasting this function to several controllers
    public function GlobalFunction ($parameter) {
        //Use parameter and return something
    }
}

创建ControllerPlugins 是一种解决方案,我还阅读了有关创建和设置StdLib 的信息。那么对于只在控制器上调用的函数的最佳实践是什么?

另外两个相关问题:

接受的答案中描述的插件将完成这项工作。但是在什么情况下你不想使用插件并且会去寻找另一个解决方案?我只是想把它照亮,因为我没有找到足够的文档。

另一个兴趣点。如果这个插件也必须对多个模块可用怎么办?在应用内设置插件,在Zend App的module\Application\Config\module.config.phpConfig\Autoload\Global.php内设置?

【问题讨论】:

    标签: php inheritance zend-framework2


    【解决方案1】:

    您可能想查看提供的几个Zend\Mvc\Controller\Plugin-Classes。最终,这一切都取决于您的“全局功能”应该做什么。它可能适合作为 ControllerPlugin 执行,也可能更适合作为您的服务之一提供的功能。

    要编写自己的 ControllerPlugin,请执行以下操作:

    namespace Yournamespace\Controller\Plugin;
     
    use Zend\Mvc\Controller\Plugin\AbstractPlugin;
     
    class YourPlugin extends AbstractPlugin
    {
        public function doSomething()
        {
            // ...
        }
    }
    

    在配置中注册您的插件,在 getConfig() 中使用顶级数组键或在您的模块 getControllerPluginConfig() 中没有顶级:

    'controller_plugins' => array(
        'invokables' => array(
            'yourPlugin' => 'Yournamespace\Controller\Plugin\YourPlugin',
        )
    ),
    

    然后简单地使用它:

    public function indexAction()
    {
        $plugin = $this->yourPlugin();
        $plugin->doSomething();
    
        return new ViewModel();
    }
    

    如果你只是想调用$this->yourPlugin($paramX, $paramY),那么你必须为你的ControllerPlugin定义一个__invoke()方法。

    希望这会有所帮助。

    【讨论】:

    • 非常感谢@Sam,我有点问这个问题,因为我没有找到明确定义全局函数的 ZF2 手册。这是关于在哪种情况下最佳实践。对于上面的示例,插件将完成这项工作。但是在什么情况下你不想使用插件并且会去寻找另一个解决方案?我只是想把它照亮,因为我没有找到足够的文档。
    • 最终,您可以将所有内容作为插件提供。但是,一旦背后的逻辑变得过于复杂,最好为此编写一个服务并让插件与服务交互。它始终取决于您需要该功能的场合。如果您 100% 确定您只需要在控制器内部使用它,那么只需编写一个插件。但是,如果在其他任何地方都需要它,请编写一个服务。然后,您可以添加与服务交互的插件。
    • 致命错误:调用未定义的方法 Namespace\Controller\Plugin\MyPlugin::getServiceLocator()
    • @Sam 非常感谢.. 它帮助很大。有没有与此类似的东西,我可以通过它为所有页面(如侧边栏)保留我的 html 的一部分并动态填充它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多