ZF2 MVC全局功能

Kwi*_*ido 3 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

另外两个相关问题:

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

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

Sam*_*Sam 7

您可能希望查看提供的几个Zend\Mvc\Controller\Plugin类.最终,这完全取决于你的"全球功能"应该做什么.它可能适合作为ControllerPlugin执行,也可能更适合作为您的某个服务提供的功能.

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

namespace Yournamespace\Controller\Plugin;

use Zend\Mvc\Controller\Plugin\AbstractPlugin;

class YourPlugin extends AbstractPlugin
{
    public function doSomething()
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

在配置中注册您的插件,可以getConfig()使用top-level-array-key在内部,也可以在getControllerPluginConfig()没有顶级的模块内注册:

'controller_plugins' => array(
    'invokables' => array(
        'yourPlugin' => 'Yournamespace\Controller\Plugin\YourPlugin',
    )
),
Run Code Online (Sandbox Code Playgroud)

并简单地使用它:

public function indexAction()
{
    $plugin = $this->yourPlugin();
    $plugin->doSomething();

    return new ViewModel();
}
Run Code Online (Sandbox Code Playgroud)

如果您只想调用$this->yourPlugin($paramX, $paramY),则必须为__invoke()ControllerPlugin 定义一个方法.

希望这可以帮助.

  • 最终,您可以将所有内容作为插件提供.但是,一旦背后的逻辑变得过于复杂,最好为此编写服务并让插件与服务进行交互.它总是取决于您需要的功能.如果您100%确定只需要在控制器中使用它,只需编写一个插件即可.但如果它需要任何地方,请编写服务.然后,您可以添加与服务交互的插件. (2认同)