ZF2 MVC全局功能

时间:2013-05-08 10:26:11

标签: php inheritance zend-framework2

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

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

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的内容。那么只能在控制器上调用的函数的最佳实践是什么?

另外两个相关问题:

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

另一个骚扰点。如果这个插件必须可用于多个模块怎么办?在应用程序中设置插件并在module\Application\Config\module.config.php内或在@Jend App的Config\Autoload\Global.php内进行设置?

1 个答案:

答案 0 :(得分:7)

您可能希望查看提供的几个Zend\Mvc\Controller\Plugin - 类。最终,这一切都取决于你的全球功能"应该做的。它可能适合作为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()方法。

希望这有帮助。