【问题标题】:What's the best way to call a controller with MVC?用 MVC 调用控制器的最佳方法是什么?
【发布时间】:2011-12-17 21:42:28
【问题描述】:
我对 MVC 架构还很陌生,但我掌握得很好,我自己的框架几乎完成了。
不过,我遇到了“设计问题”,如何调用控制器?
控制器,如检查用户是否点击提交按钮的函数。
控制器示例:
$class->login($_POST['username'], $_POST['password']).
我知道很多 MVC 框架和应用程序通过带有 $_GET 参数的 URL 调用它,但我认为为每个需要登录等功能的页面设置一个方法或一个类是愚蠢的。
你们是怎么做到的?你的方法是什么?
感谢任何帮助!
【问题讨论】:
标签:
php
model-view-controller
design-patterns
architecture
【解决方案1】:
您可能想查找前端控制器概念(和控制反转),您可能已经以某种形式使用它,但可能不知道。 Front Controller 分析 URL 和事物的当前状态,并确定要加载的控制器。
在我的框架中,我有具有属性的“路由”,其中一个是“需要登录”。前端控制器确定需要运行什么“路由”/控制器并检查该路由的先决条件,例如登录要求。如果用户未登录,则加载登录“路由”/控制器,而不是请求的“路由”/控制器。如果登录成功,则将控制权传递给适当的“路由”控制器。
管理登录不应该是每个控制器的工作,只有一个控制器应该这样做,通常是前端控制器。任何控制器都应该能够在任何 URL 下加载,因为它是决定加载哪个控制器的前端控制器。子控制器不知道“为什么”要加载,只知道加载是为了完成他们的一项工作。
【解决方案2】:
您可以拥有一个包含函数 requireAccess($access_level) 的基本控制器。其他控制器将扩展此控制器。如果不存在正确的访问级别,requireAccess() 将重定向到登录页面。
至于在 MVC 中使用 GET 变量进行干净 url 的重定向,我不建议这样做。它可能会导致需要包含斜杠的变量的问题。相反,我们通常希望获取原始请求 uri,然后自己解析它。
通常,MVC url 遵循模式/Controller/Action/Id/etc