将通用变量和函数放入Zend框架2(带有教义)的最佳/标准方法是什么,可以在所有模块中使用,特别是它们的控制器。
我在某处读到我们的控制器应该扩展另一个控制器(如AppCommonController),后者又扩展了AbstractActionController。然后,AppCommonController将定义我们可以在扩展它的任何控制器中访问的公共变量和函数。
有更好/标准的方法吗?
--- ---更新
比如说,我想在大多数控制器(不同模块)中检查我的站点的当前模式(测试或实时),并因此希望在操作中做必要的操作。
我在一些控制器中写下以下内容:
private $__currentMode = '';
public function __construct()
{
//following will be set to Live or Test depending on a session value
$this->setCurrentMode('Live');
}
public function setCurrentMode($mode)
{
$this->__currentMode = $mode;
}
public function getCurrentMode()
{
return $this->__currentMode;
}
我认为将上面的代码放在需要检查当前模式的所有控制器中是个坏主意。
所以我想把它(currentMode属性和getter / setter函数)放在某个地方,我可以在任何需要的地方访问它们。
答案 0 :(得分:2)
似乎这就是控制器插件的用途
首先创建一个控制器插件......
namespace Application\Controller\Plugin;
use Zend\Mvc\Controller\Plugin\AbstractPlugin;
class MyModeHelper extends AbstractPlugin
{
protected $mode;
public function __construct($mode)
{
$this->mode = $mode;
}
public function getMode()
{
return $this->mode;
}
}
然后使用getControllerPluginConfig()
方法
// in Application/Module.php
public function getControllerPluginConfig()
{
return array(
'factories' => array(
'myModeHelper' => function($sm) {
// get mode from environment
$mode = 'live';
return new Controller\Plugin\MyModeHelper($mode);
}
)
); //fixed syntax error
}
}
现在,只要您在控制器中调用插件,就可以使用插件
// in your controllers
public function indexAction()
{
if ($this->myModeHelper()->getMode() == 'live') {
// do live stuff
} else {
// do test stuff
}
return new ViewModel();
}