Php ZF2 MVC全局函数

Php ZF2 MVC全局函数,php,inheritance,zend-framework2,Php,Inheritance,Zend Framework2,对于多个控制器的应用程序,使函数/方法全局化的最佳实践是什么? 例如,假设我们有一个控制器。此控制器正在使用一个函数,但我们不想将其复制粘贴到另一个控制器,只想调用该函数 类控制器名称扩展了AbstractActionController{ //你的行为 //必须成为一种召唤, //而不是将此功能复制粘贴到多个控制器 公共函数全局函数($参数){ //使用参数并返回一些内容 } } 创建ControllerPlugins是一种解决方案,我还阅读了有关创建和设置StdLib的内容。那么,对于只在

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

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

类控制器名称扩展了AbstractActionController{
//你的行为
//必须成为一种召唤,
//而不是将此功能复制粘贴到多个控制器
公共函数全局函数($参数){
//使用参数并返回一些内容
}
}
创建
ControllerPlugins
是一种解决方案,我还阅读了有关创建和设置
StdLib
的内容。那么,对于只在控制器上调用的函数,什么是最佳实践呢

其他两个相关问题: 接受答案中描述的插件将完成这项工作。但是,在什么情况下,你不想使用一个插件,并会去另一个解决方案?我只是想让它更亮一点,因为我没有找到足够的文档


另一个问题。如果这个插件必须同时适用于多个模块,该怎么办?在应用程序中设置插件,并在Zend应用程序的
module\application\Config\module.Config.php
Config\Autoload\Global.php
中设置插件?

您可能想看看提供的几个类。最终,这一切都取决于你的“全局功能”应该做什么。它可能适合作为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定义一个
\u invoke()
方法


希望这能有所帮助。

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