我知道有很多关于哪个PHP框架是最好的争论,这不是关于这个;)的主题。此线程是关于开发人员如何处理属于控制器的关注点的分离。
在MVC-ish框架中,控制器将提供页面(获取)并接受表单提交(发布)。但是,我发现即使是微不足道的控制器也很难理解。
使用以下代码点火器示例:
class TrivialController extends MY_CONTROLLER{
public function login(){
//Load a view containing a login form
}
public function login_p(){
//Load user model + login
//Success / Faillure view
}
}
或
class TrivialController extends MY_CONTROLLER{
public function login(){
if(GET){
//Load a view containing a login form
} else if (POST) {
//Load user model + login
//Success / Faillure view
}
}
}
我发现这两种选择都同样麻烦:
- 选项 1:两个具有相同名称的方法,用于相同的功能。这将使控制器更难阅读。
- 选项 2:由请求类型的大
if-else
驱动的方法。这将使该方法更难阅读。
所以,问题来了。您在实践中如何处理这个问题?
GET/POST 是两个不同但功能上具有凝聚力的东西。
这是 Web 应用程序中非常常见的工作流:
- 发出 GET 请求,该请求触发查询以构造表单
- 发出 POST 请求,即
- A) 验证并执行命令。按顺序,客户端将重定向到成功页面。
- B) 验证失败。按顺序,客户端被重定向到失败页面(很可能是 GET 页面)。
我认为这些足够不同,可以将它们拆分为不同的方法,但又足够相似,可以保留在同一控制器中。
问题是命名约定。应简明扼要地区分命令和查询操作,并使用object-verb
名称来描述主题正在使用的内容以及正在使用的操作。
class TrivialController extends MY_CONTROLLER{
public function askCredentials(){
// Show login form
}
public function verifyCredentials(){
// Login
}
}