【发布时间】:2011-01-10 19:50:41
【问题描述】:
对于用php编写的项目,我可以在类控制器中调用多个(或多个)控制器吗? http://img192.imageshack.us/img192/7538/mvc03.gif中的示例
问:我需要调用另一个控制器的操作...如果我确实喜欢上面的图片,那我就是不道德?
谢谢, 维尼修斯。
【问题讨论】:
标签: php model-view-controller controller
对于用php编写的项目,我可以在类控制器中调用多个(或多个)控制器吗? http://img192.imageshack.us/img192/7538/mvc03.gif中的示例
问:我需要调用另一个控制器的操作...如果我确实喜欢上面的图片,那我就是不道德?
谢谢, 维尼修斯。
【问题讨论】:
标签: php model-view-controller controller
我确信您可以使用您使用的任何框架做您想做的事。如果由于某种原因您无法在本地进行,那么您可以根据需要扩展您的框架。
话虽如此,我个人不喜欢控制器调用另一个控制器的想法。如果仅从理论角度来看,它似乎在某种程度上打破了 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();
}
}
【讨论】:
不道德?任何人……回到现实。
是的,一个控制器可以调用另一个控制器的动作。例如,在 cakePHP 中,此功能是通过 requestAction
提供的// pass uri to request action and receive vars back
$ot3 = $this->requestAction('/stories/xenu');
如果您自己滚动,如何实现它的细节将非常具体到您的框架。
【讨论】:
然后您需要修改框架,找到启动控制器的位置并在那里添加您的第二个控制器。
你正在使用什么框架?
【讨论】:
你可以随心所欲。如果您不想,则不必使用 MVC。但是,在 MVC 中,您确实应该一次只激活一个控制器。您可能需要多个视图或模型,而不是另一个控制器。加载网站菜单和页脚的页眉和页脚视图并没有任何问题。
【讨论】:
如果您正在构建另一个 Controller,然后觉得您需要访问以前的 Controller 的功能来访问其功能(因为它适用于特定/所需的 Model),那么您为后者开发的 Model 可能需要被重构。说白了,你的目标模型可能做得太多了。分手吧。
您试图通过调用已开发的控制器的方法来避免重复自己 (DRY),但这样做会在两个控制器之间创建紧密耦合!如果借用的控制器发生变化,它会对借用的控制器产生影响。不好,琼斯博士。
【讨论】: