使用一个控制器来处理普通和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
}
}
}
有哪些优点和缺点?
答案 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实现。
如果您是其中一个人,那么他们使用类似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检查,因为我的数据是公开的,我希望它尽可能地进行...
对于发布/获取私人数据,我不想使用这种双方法,因为它更好地拥有良好和干净(安全)的代码......
然而......一切都取决于你的选择。一切皆有可能!而且没有常数是正确的,而不是......