【问题标题】:get current controller获取当前控制器
【发布时间】:2011-05-19 17:26:59
【问题描述】:

在我想要到达当前控制器的函数中:

$front = Zend_Controller_Front::getInstance();

这仅提供处理程序,但不提供当前控制器。

我将代码从函数更改为控制器内部。 并询问了我从 getInstance 获得的处理程序和 this 的来源

var_dump(get_class($front), get_class($this));

我明白了:

string 'Zend_Controller_Front' (length=21)
string 'IndexController' (length=15)

我怎样才能到达真正启动的前端控制器?

我不能作为参数传递,因为这个函数被使用了万亿次。

【问题讨论】:

  • 为了快速,我定义了一个全局变量,在 IndexController init 中我用 $this 设置它。
  • 获取一个动作控制器的实例通常不是一个好主意。如果您需要驻留在您的应用程序或库中其他地方可用的动作控制器中的代码,那么该代码可能一开始就应该在您的库中。 takehin 的第二个回答也说明了这一点。
  • 我需要一个在控制器中定义的变量,用于创建链接的函数。(href)我应该将此函数绑定到一个类吗?
  • 控制器中任何不是动作的方法都应该被标记为protected。控制器中受保护的方法通常是一个标志,您应该将它们分隔在action helper中。

标签: php zend-framework front-controller


【解决方案1】:
Zend_Controller_Front::getInstance()->getRequest()->getControllerName();

【讨论】:

  • 它返回字符串'index' (length=5) 我要获取实例!
【解决方案2】:

可能:

$front = Zend_Controller_Front::getInstance()
$request = $front->getRequest();
$module = ucfirst($request->getModuleName());
$controller = ucfirst($request->getControllerName());

$instance = new $module . '_' . $controller . 'Controller';

In Action Helper:

$instance = $this->getActionController();

但是,这可能意味着您的架构有问题。
您应该将您需要的通用代码移动到操作助手、服务或模型中。

【讨论】:

  • 当然,第一种方法会生成控制器类的第二个实例,而不是在调度循环中创建的实例。正确的?在任何情况下,正如您所注意到的,需要对控制器实例本身的引用可能表明存在一些架构问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 2012-03-23
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
相关资源
最近更新 更多