Kohana - 你在哪里放置AJAX脚本?

时间:2009-04-05 14:51:35

标签: php ajax model-view-controller design-patterns

我正在使用Kohana,但此问题适用于Rails,CI或任何其他MVC Web开发框架。坚持一个服务器端AJAX脚本的最佳位置在哪里?

我正在计划创建Ajax_Controller并使用每个脚本的方法/操作。

例如,主页 index.php/home 上的登录表单会向 index.php/ajax/login 发送XMLHttpRequest,并且编辑个人资料表单 index.php/profile/edit 会向 index.php/ajax/editprofile 发送XMLHttpRequest。什么是最佳做法?

9 个答案:

答案 0 :(得分:9)

我倾向于将我的ajax动作放在与任何给定模型的非ajax动作相同的控制器中。

如果可以,我尝试使用相同的操作,只更改输出类型。大多数任务都应该有一个非ajax版本,所以这往往很好。非常方便减少逻辑重复。

答案 1 :(得分:7)

AJAX跨越了所有MVC边界。也就是说,它不仅仅涉及模型,视图或控制器之一。

  • 您的AJAX脚本将调用您网站上的脚本 - 因此这将涉及您为此目的创建的控制器图层的一部分。
  • 该控制器将使用模型层提供的界面访问数据库,就像非AJAX请求一样。
  • 回复客户端的响应数据可以打包为JSON或XML等。从技术上讲,这是视图图层的任务,但是如果您的应用程序对视图图层的定义只不过是“HTML模板系统”而不是“处理和格式化任何发送回客户端的内容”无论是HTML还是像XML这样的东西“那么你的XML或JSON生成可能需要进入它自己的一小部分。

至于自己发送脚本(Javascript文件),这可能是由Web服务器直接处理,而不是在MVC框架内处理。

答案 2 :(得分:5)

您是否为GET和POST请求制作了不同的控制器?我不。在我看来,JS请求也不应该以不同的方式处理。

我个人看到JS请求就像GET,POST或任何其他类型的请求。因此,如果我有与用户相关的基于JS的操作,我只需在用户控制器中创建它们。

答案 3 :(得分:2)

如果你的意思是AJAX(Javascript)脚本本身,它们应该进入你的public / js文件夹。但是,如果您指的是这些AJAX请求调用的操作,则应将它们视为相应控制器的任何其他操作。要完全RESTful,您应该使用不同的格式(json,xml等)作为这些操作的返回值。

答案 4 :(得分:2)

我是一个菜鸟,但根据我的理解,用php mvc实现ajax ...思考步骤可能是:

  • 将现有php视图层的定义/功能从“HTML模板”更改为“结果格式化(XML,JSON等......) - >相关模块的结果,然后由控制器调用以输出到AJAX对象,那么这意味着你需要使用格式化方法将视图层写入每个特定的类
  • PHP模块层保持不变
  • 使用JS构建一个Ajax路由器类,它与您在PHP中路由的结构相同
  • 使用JS构建一个ajax结果处理程序类来处理从PHP控制器(XML JSON等等)返回的结果,然后从这里做任何你想要的用户交互,这将通过上面的Ajax路由器类调用

所以,

ajax router (send XMLhttprequest)
-> PHP controllers  C
-> PHP module -> PHP view results M
-> PHP controllers output results V
-> ajax results handle (into page)

答案 5 :(得分:1)

我不使用Kohana,但我在我的框架中所做的是AJAX脚本是控制器。我尝试将它们视为独立控制器,但最终它们只是控制器。

答案 6 :(得分:1)

使用单独的控制器是个好主意。我要么按功能组织我的控制器,要么按返回类型组织操作。

此外,当我使用Pylons时,我可以使用@jsonify修饰一个动作,并自动将python对象转换为JSON。非常方便。

答案 7 :(得分:1)

我喜欢将所有ajax请求保存在一个控制器中,通常通过共享模型(非ajax控制器也使用)调度他们的请求

主要区别在于通过ajax控制器(html片段,json数据等)或非ajax控制器(完整页面)生成的视图

答案 8 :(得分:0)

您可以将其包装为一般的REST-api,并使用RESTful约定和URI。 例如:

而不是index.php / ajax / editprofile它可能是对index.php / api / profile / profilename的PUT请求。