【问题标题】:MVC - Can I call more than one (or multiple) controller in class controller?MVC - 我可以在类控制器中调用多个(或多个)控制器吗?
【发布时间】:2011-01-10 19:50:41
【问题描述】:

对于用php编写的项目,我可以在类控制器中调用多个(或多个)控制器吗? http://img192.imageshack.us/img192/7538/mvc03.gif中的示例

问:我需要调用另一个控制器的操作...如果我确实喜欢上面的图片,那我就是不道德?

谢谢, 维尼修斯。

【问题讨论】:

    标签: php model-view-controller controller


    【解决方案1】:

    我确信您可以使用您使用的任何框架做您想做的事。如果由于某种原因您无法在本地进行,那么您可以根据需要扩展您的框架。

    话虽如此,我个人不喜欢控制器调用另一个控制器的想法。如果仅从理论角度来看,它似乎在某种程度上打破了 MVC 范式。我可能会做的是构建一个包含所需功能的库类,然后让两个控制器将该类实例化为成员并调用所需的函数。

    例如,使用 CodeIgniter:

    库/MyLib.php:

    class MyLib
    {
        public function MyFunc()
        { /* do whatever */ }
    }
    

    控制器/ControllerA.php:

    class ControllerA extends Controller
    {
        public function index()
        { 
            $this->load->library('MyLib');
            $this->mylib->MyFunc();
        }
    }
    

    控制器/控制器B:

    class ControllerB extends Controller
    {
        public function index()
        {
            $this->load->library('MyLib');
            $this->mylib->MyFunc();
        }
    }
    

    【讨论】:

      【解决方案2】:

      不道德?任何人……回到现实。

      是的,一个控制器可以调用另一个控制器的动作。例如,在 cakePHP 中,此功能是通过 requestAction

      提供的
      // pass uri to request action and receive vars back
      $ot3 = $this->requestAction('/stories/xenu');
      

      如果您自己滚动,如何实现它的细节将非常具体到您的框架。

      【讨论】:

      • 感谢您的回复。我很可能会为我自己的公司的 Intranet 项目复制 CakePHP 中的函数 requestAction ......我会想的。谢谢,伙计。
      • 没问题。乐意效劳。如果您这样做是出于教育目的,那么创建自己的框架是一种很好的学习方式。但是,如果它用于生产环境,有很多人会建议只使用许多优秀的预构建框架之一(cakePHP、Zend、symfony),因为它们是社区构建、支持、测试、维护和功能丰富的。
      【解决方案3】:

      然后您需要修改框架,找到启动控制器的位置并在那里添加您的第二个控制器。

      你正在使用什么框架?

      【讨论】:

      • 我没有使用任何框架。我使用 MVC 方法创建了自己的项目。
      【解决方案4】:

      你可以随心所欲。如果您不想,则不必使用 MVC。但是,在 MVC 中,您确实应该一次只激活一个控制器。您可能需要多个视图或模型,而不是另一个控制器。加载网站菜单和页脚的页眉和页脚视图并没有任何问题。

      【讨论】:

      • 是的,在我自己的内网项目中,需要控制很多模型和很多视图。但刚才我观察到的是他需要另一个控制器来处理你想要的一些信息......谢谢!
      【解决方案5】:

      如果您正在构建另一个 Controller,然后觉得您需要访问以前的 Controller 的功能来访问其功能(因为它适用于特定/所需的 Model),那么您为后者开发的 Model 可能需要被重构。说白了,你的目标模型可能做得太多了。分手吧。

      您试图通过调用已开发的控制器的方法来避免重复自己 (DRY),但这样做会在两个控制器之间创建紧密耦合!如果借用的控制器发生变化,它会对借用的控制器产生影响。不好,琼斯博士。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-08
        • 1970-01-01
        • 2017-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-01
        相关资源
        最近更新 更多