PHP 控制器.在服务页面和表单之间分离关注点


PHP controllers. Separation of concerns between serving pages and forms

我知道有很多关于哪个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
     }
}