【问题标题】:Calling member function of other controller in zend framework?在zend框架中调用其他控制器的成员函数?
【发布时间】:2009-05-20 05:29:47
【问题描述】:

是否可以在zend框架中调用另一个控制器的成员函数,如果可以,那么如何?

<?php
class FirstController extends Zend_Controller_Action {
    public function indexAction() {
         // general action 
    }   

    public function memberFunction() {
         // a resuable function
    }
}

这是另一个控制器

<?php
class SecondController extends Zend_Controller_Action {
    public indexAction() {
         // here i need to call memberFunction() of FirstController
    }
}

请解释我如何从第二个控制器访问 memberFunction()。

解决方案

更好的想法是定义一个 AppController 并让所有常用的控制器扩展 AppController,从而进一步扩展 Zend_Controller_Action。

class AppController extends Zend_Controller_Action {
    public function memberFunction() {
         // a resuable function
    }
}

class FirstController extends AppController {
    public function indexAction() {
         // call function from any child class
         $this->memberFunction();
    } 
}

现在 memberFunction 可以从扩展 AppController 的控制器中调用,作为简单继承规则。

【问题讨论】:

  • 仅供参考,当我需要通用功能时,我绝对更喜欢设置共享类或模块。但是,我在使用 ZF2 时遇到了一种情况,在这种情况下,使用在其他几个控制器上扩展的父 AppController 会很有帮助。您的解决方案效果很好。在 ZF2 中,您设置:"class AppController extends AbstractActionController" 和子控制器将是相同的:"class FirstController extends AppController" 我知道有更好的方法可以做到这一点,我可能应该重新考虑一些应用程序结构,但它可以工作。跨度>

标签: php zend-framework


【解决方案1】:

控制器的设计目的不是以这种方式使用。如果您想在当前控制器之后执行另一个控制器的动作,请使用_forward() 方法:

// Invokes SecondController::otherActionAction() after the current action has been finished.
$this->_forward('other-action', 'second');

请注意,这仅适用于 action 方法(“memberAction”),不适用于任意成员函数!

如果SecondController::memberFunction() 执行跨多个控制器所需的操作,则将该代码放入操作帮助程序或库类中,以便两个控制器可以访问共享功能而不必相互依赖。

【讨论】:

  • 2015 年更新:$this->_forward() 自 ZF 1.7 起已弃用 - 请改用 $this->forward()。
  • 嗯,在撰写本文时,1.12 文档仍然引用 _forward()。但你是对的:代码清楚地显示 _forward 已弃用。谢谢!
【解决方案2】:

您应该考虑将代码分解到动作助手或模型中,以便可以从需要它的两个控制器中调用它。

问候,

罗伯...

【讨论】:

    【解决方案3】:

    我建议您遵循 DRY 并将这些功能移动到公共库位置。例如在库文件夹中创建

    My/Util/ 
    

    和文件

    CommonFunctions.php
    

    然后打电话给你的班级

    My_Util_CommonFunctions
    

    并定义你的方法

    现在您可以使用您必须注册的新命名空间从代码中的任何位置调用它们。

    $loader = Zend_Loader_Autoloader::getInstance();
    $loader->registerNamespace(array('My_'));
    

    在任何控制器中,您都可以使用以下方法调用您的自定义方法:

    My_Util_CustomFunctions::yourCustomMethod($params);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多