PHP 个控制器。服务页面和表单之间的关注点分离
PHP controllers. Separation of concerns between serving pages and forms
我知道关于哪个 PHP 框架最好的争论很多,这不是关于这个的话题;)。此线程是关于开发人员如何处理属于控制器的关注点分离。
在 MVC-ish 框架中,控制器将提供页面 (get) 并接受表单提交 (post)。然而,我发现即使是微不足道的控制器也很难理解。
使用以下 CodeIgniter 示例:
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 是两个不同但在功能上具有内聚性的事物。
这是网络应用程序中非常常见的工作流程:
- 发出GET请求,触发查询构造表单
- 一个POST请求,即
- A) 已验证并执行命令。随后,客户端被重定向到成功页面。
- B) 验证失败。随后,客户端被重定向到失败页面(很可能是 GET 页面)。
我认为这些差异足以将它们拆分成不同的方法,但又足够相似以保留在同一个控制器中。
问题出在命名约定上。您应该简明区分 command and query 操作,并使用 object-verb
名称来描述您正在使用的主题以及您正在使用它做什么。
class TrivialController extends MY_CONTROLLER{
public function askCredentials(){
// Show login form
}
public function verifyCredentials(){
// Login
}
}
我知道关于哪个 PHP 框架最好的争论很多,这不是关于这个的话题;)。此线程是关于开发人员如何处理属于控制器的关注点分离。
在 MVC-ish 框架中,控制器将提供页面 (get) 并接受表单提交 (post)。然而,我发现即使是微不足道的控制器也很难理解。
使用以下 CodeIgniter 示例:
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 是两个不同但在功能上具有内聚性的事物。
这是网络应用程序中非常常见的工作流程:
- 发出GET请求,触发查询构造表单
- 一个POST请求,即
- A) 已验证并执行命令。随后,客户端被重定向到成功页面。
- B) 验证失败。随后,客户端被重定向到失败页面(很可能是 GET 页面)。
我认为这些差异足以将它们拆分成不同的方法,但又足够相似以保留在同一个控制器中。
问题出在命名约定上。您应该简明区分 command and query 操作,并使用 object-verb
名称来描述您正在使用的主题以及您正在使用它做什么。
class TrivialController extends MY_CONTROLLER{
public function askCredentials(){
// Show login form
}
public function verifyCredentials(){
// Login
}
}