好的做法? PHP MVC控制器Ajax

时间:2012-11-08 13:35:19

标签: php ajax model-view-controller controller

使用一个控制器来处理普通和ajax调用是一个好习惯吗:

<?php

class SomeController extends Controller {

    function index() {

         if(!$this->input->is_ajax_request()) {
             // load model
             // create form
             // pass data to view
             // ...
         } else {
            // validate input
            // load model
            // write data to database
            // return with some json string
         }

    }

}

有哪些优点和缺点?

4 个答案:

答案 0 :(得分:2)

即使这是一个AJAX请求,仍然需要验证输入。这不是你发送你的应用程序的输入(通过AJAX),它是浏览器,你不能信任

作为一般设计原则,避免特殊情况(此处:ajax与非ajax)。一般来说,您希望平等对待所有案例,因此最终会得到orthogonal approach

正如你所看到的那样

class SomeController extends Controller {

    function index() {

         if(!$this->input->is_ajax_request()) {

             // validate input <-- XXX here we need to validate it too

             // load model
             // create form
             // pass data to view
             // ...
         } else {
            // validate input
            // load model
            // write data to database
            // return with some json string
         }

    }

}

这会导致代码重复(难以维护并保持同步)。

您的代码,正交方法:

class SomeController extends Controller {

    function index() {
         // load model (takes care of his own validation, the self-containment principle of OOP)
         // coordinate same business logic done by different models
         // return models/data to the view, the framework will decide whether it uses the html or the json view file
    }

}

相反,模型(它可以是相同的模型类,或Zend Framework中的Form模型,或ZF2中的there is之类的保湿方法可以完成大部分工作(与表一起) Gateway,DAO(类似于Doctrine 2)或类似的模型类,你可以为HTML和JSON创建两个sepparate视图。

例如,在Zend Framework 2中,为您透明地选择了正确的视图,所以确实没有任何if / else关于“这是否是这个AJAX?”。

您应该尝试使用现代PHP框架(5.3+)来了解如何处理design of your app in PHP

答案 1 :(得分:1)

简答:取决于。

XHR(营销人员称之为#34; AJAX&#34;)与普通浏览器请求之间的真正区别在于XHR需要不同形式的响应。

在基于MVC的Web模式中,负责生成响应的部分是视图实例。观点应该认识到它必须产生哪种反应,并采取相应的行动。此方案中的控制器角色只是更改当前视图的状态。

或者,您可以在引导阶段检测Accept HTTP标头,并基于该标头初始化不同的视图实例。

  

使用&#34;完全实现视图&#34;我的意思是一个实例,它包含MVC三元组中的UI逻辑,可以决定响应哪个。此响应可以是HTML文档,由多个模板,JSON / XML文件或简单的HTTP标头组成。

  • 优点:正确分离关注点,更易于维护
  • 缺点:必须实施完整的MVC

..但是大多数人都没有使用完整的MVC实现。

如果您是其中一个人,那么他们使用类似Rails的page controller模式变体而不是受MVC启发的模式,那么您将有力创建一个单独的控制器来处理XHR。

在这种情况下,这不是真实的观点。它被哑模板替换,而UI逻辑已在页面控制器中合并。在这种情况下,唯一务实的选择是创建一个单独的控制器来处理XHR。

  • 优点:在小型项目中实施起来更简单
  • 缺点:可能的代码重复,难以维护

答案 2 :(得分:0)

我认为这是开发者的选择,请考虑一下:

我认为这是开发者的选择,请考虑一下。我见过的客户移动网站的开发。他们有一个网上商店和一个模型商店:

/store/model/order.php
/store/controller/order.php
/store/view/order.php

而不是

/store/model/order_mobile.php
/store/controller/order_mobile.php
/store/view/order_mobile.php

管理层是一场噩梦。单独的图像,CSS,移动客户端的多个编码重复。他们现在的解决方案是将整个网站转换为响应式设计

/new-dev-store-responsive/model/order.php
/new-dev-store-responsive/controller/order.php
/new-dev-store-responsive/view/order.php

相同的代码,但更清洁。而且我会在我的模板中使用PHP结构调用某些代码的PHP结构而不是其他代码。再次,它可能很难管理。最好处理使用JSON或外部静态文件 - 所以PHP是使用GET,POST等驱动的。如果他们有JavaScript,AJAX与PHP一起使用.. PHP代码应该保持PHP IMO ..

/new-dev-store-responsive/model/order.php
/new-dev-store-responsive/controller/order.php
/new-dev-store-responsive/view/order.php

//new-dev-store-responsive-cdn.com/assets/js/order.js
//new-dev-store-responsive-cdn.com/assets/css/order.css
//new-dev-store-responsive-cdn.com/assets/imgs/order/checkout.jpg

答案 3 :(得分:0)

您的方法有一些优点和缺点。

对于发布公共数据,没有问题。

对于获取公共数据我通常更喜欢在单独的控制器中执行,很多时候我甚至没有进行ajax检查,因为我的数据是公开的,我希望它尽可能地进行...

对于发布/获取私人数据,我不想使用这种双方法,因为它更好地拥有良好和干净(安全)的代码......

然而......一切都取决于你的选择。一切皆有可能!而且没有常数是正确的,而不是......