为多个控制器的应用程序创建一个全局函数/方法的最佳做法是什么?
例如,假设我们有一个控制器。这个控制器正在使用一个函数,但是我们只想调用该函数,而不是将它复制粘贴到另一个控制器。
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
内进行设置?
答案 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()
方法。
希望这有帮助。