3

使多个控制器的应用程序全局功能/方法的最佳实践是什么?

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

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.phpZend Config\Autoload\Global.phpApp 中设置插件?

4

1 回答 1

7

您可能想查看提供的几个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),那么你必须为__invoke()你的 ControllerPlugin 定义一个方法。

希望这可以帮助。

于 2013-05-08T10:36:27.650 回答