使用MVC调用控制器的最佳方法是什么?

时间:2011-10-29 15:57:59

标签: php model-view-controller design-patterns architecture

我是MVC架构的新手,但我很好地接受了它,几乎完成了我自己的框架。

尽管如此,我有一个'设计问题',如何调用控制器?

控制器,与检查用户是否点击提交按钮的功能一样。

控制器示例:

$class->login($_POST['username'], $_POST['password'])

我知道很多MVC框架和应用都通过带有$_GET参数的URL来调用它,但我认为为每个需要登录等功能的页面设置一个方法或一个类是愚蠢的。

你们是怎么做到的?你的方法是什么?

感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

您可能想要查找前端控制器概念(以及控制反转),您可能已经以某种形式使用它,但可能不知道它。 Front Controller分析URL和当前状态,并确定要加载的控制器。

在我的框架中,我有“路由”,它们具有属性,一个是“需要登录”。 Front Controller确定需要运行什么“路由”/控制器,并检查该路由的先决条件,如登录要求。如果用户未登录,则加载登录“路由”/控制器而不是所请求的“路由”/控制器。如果登录成功,则控制权将传递给相应的“路径”控制器。

管理登录不应该是每个控制器的工作,只有一个控制器应该这样做,通常是前端控制器。任何控制器都应该能够在任何URL下加载,因为它是确定要加载哪个控制器的前端控制器。子控制器不知道他们正在加载“为什么”,只知道他们正在加载他们的1个工作。

答案 1 :(得分:1)

您可以拥有一个包含函数requireAccess($ access_level)的基本控制器。其他控制器将扩展此控制器。如果没有正确的访问级别,requireAccess()将重定向到登录页面。

至于在MVC中使用GET变量重定向清理URL,我不建议这样做。它可能会导致问题,因为想要包含斜杠的变量。相反,我们通常希望得到原始请求uri,并自己解析它。

通常,MVC网址遵循模式/Controller/Action/Id/etc