Zend framework2 在zf2中放置通用变量和函数以跨控制器使用

Zend framework2 在zf2中放置通用变量和函数以跨控制器使用,zend-framework2,Zend Framework2,将通用变量和函数放入Zend framework 2中(使用条令)的最佳/标准方法是什么,以用于所有模块,特别是其控制器 我在某个地方读到,我们的控制器应该扩展另一个控制器(如AppCommonController),后者反过来扩展AbstractActionController。然后,AppCommonController将定义我们可以在任何扩展它的控制器中访问的公共变量和函数 有没有更好的/标准的方法 ---更新--- 例如,我想在我的大多数控制器(跨不同模块)中检查我的站点(测试或现场)的

将通用变量和函数放入Zend framework 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函数)放在某个地方,从那里我可以在所有需要的控制器中访问它们。

嗯,这在很大程度上取决于函数

第一:变量可能最好放在配置中。从那里,只要有
服务定位器
,就可以访问它们

就函数而言,它在很大程度上取决于函数的功能。它们是某种控制器逻辑吗?那么您的方法
Mymodule\Stdlib\Controller\Mycontroller
可能是个好主意

看看当前的“社区标准”,在
Stdlib
名称空间下有通用代码是普遍接受的


除上述内容外,我不知道该告诉你什么,因为你的问题相当模糊。

嗯,这在很大程度上取决于函数

第一:变量可能最好放在配置中。从那里,只要有
服务定位器
,就可以访问它们

就函数而言,它在很大程度上取决于函数的功能。它们是某种控制器逻辑吗?那么您的方法
Mymodule\Stdlib\Controller\Mycontroller
可能是个好主意

看看当前的“社区标准”,在
Stdlib
名称空间下有通用代码是普遍接受的


除上述内容外,我不知道该告诉你什么,因为你的问题相当模糊。

似乎这就是控制器插件的用途

首先创建一个控制器插件

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()
方法在Module.php中告诉控制器管理器

// 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();
} 

看起来这就是控制器插件的用途

首先创建一个控制器插件

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()
方法在Module.php中告诉控制器管理器

// 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();
} 

谢谢你的回复,曼纽尔。我已经更新了我的问题,包括我所寻求的例子。你现在有什么建议?谢谢你的回复曼纽尔。我已经更新了我的问题,包括我所寻求的例子。你现在有什么建议?你的问题很公平,但你的例子不好。要回答这个问题,考虑使用性状。但是,请永远不要使用您给出的示例,您的代码不应该知道它所运行的环境。特别是,代码不应改变测试环境的行为。实际上,我的应用程序类似于支付网关后端,在测试模式下,客户的支付将转到支付测试表,在实时模式下,客户将转到支付测试表。。我的代码实际上是modedependentah,@Prashant,这很有意义。下面的控制器插件建议也是一个很好的建议。你的问题是一个公平的问题,但你的例子并不好。要回答这个问题,考虑使用性状。但是,请永远不要使用您给出的示例,您的代码不应该知道它所运行的环境。特别是,代码不应改变测试环境的行为。实际上,我的应用程序类似于支付网关后端,在测试模式下,客户的支付将转到支付测试表,在实时模式下,客户将转到支付测试表。。我的代码实际上是modedependentah,@Prashant,这很有意义。下面的控制器插件建议也是一个很好的建议。谢谢!我不知道控制器插件,你的解决方案有帮助。谢谢!我不知道控制器插件,你的解决方案有帮助。