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应用程序的?
您可能希望查看提供的几个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 定义一个方法.
希望这可以帮助.