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

时间:2016-01-29 12:44:14

标签: php codeigniter separation-of-concerns

我知道有很多关于哪个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驱动的方法。这将使该方法更难阅读。

所以,这是问题所在。你如何在实践中处理这个?

1 个答案:

答案 0 :(得分:3)

GET / POST是两个不同但功能上有凝聚力的东西。

这是Web应用程序中非常常见的工作流程:

  • 发出 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
     }

}