12

我的目的不是进行比较或讨论哪个框架更好。我知道 CakePHP 和 Rails 的强大功能。我确信有一种方法可以在两者中做类似的事情。

所以,情况就是这样:在 Rails 框架中,我习惯于做一些我想在 CakePHP 上做的事情(其中一些我在文档中没有找到)。

他们是:

包管理

在 Rails 中,我有一个“Gemfile”文件,我在其中编写了应用程序中使用的每个“gem”的版本。如果我想升级或降级,我更改版本并运行“捆绑更新”命令。你如何更新插件?您是否使用 GIT 之类的工具来检查每个新版本?

迁移

当我需要更改数据库时,我通过控制台命令“rails generate migration”创建了一个空的“迁移”文件。然后,在生成的文件中,添加更改,例如“rename_column :users, :address, :location”。之后,我运行“rake db:migrate”并迁移数据库。如何在 CakePHP 上做到这一点?

自动化部署

Rails 中的部署可以使用“Capistrano”红宝石 gem 实现自动化。基本上,我在命令行中运行“cap production deploy”。然后,根据“deploy.rb”文件上的说明,它登录到服务器,从 git 存储库中克隆最新版本的代码,并备份当前版本,以便我可以回滚。它还可以为“共享”文件夹(如用户上传)创建符号链接,重新编译资产,运行挂起的迁移,安装新的依赖项,重新启动一些服务器进程,重新启动应用程序本身,并可以执行其他命令行任务。CakePHP 上有类似的东西吗?

资产压缩

在 Rails 中,当我处于生产模式时,CSS 和 JS 资产会自动编译为单个文件,并在每次部署后重新生成。这是 Rails 3.1+ 的原生特性。在 CakePHP 上可能吗?

工人和后台作业

Rails 可以使用名为“delayed_job”的 gem 将任务排入队列,以由“workers”在后台执行,例如在用户注册后发送电子邮件。你是怎样做的?

控制器的命名空间

如果我想创建管理界面、Web 服务(例如,使用“api”命名空间)或“mobile”命名空间,我只需在“controllers”文件夹中创建相应的文件夹。然后,我将控制器放在那里并创建访问它们的路由。在 Cake 上最好的方法是什么?

从视图访问模型方法

当我从数据库中获取数据时,CakePHP 似乎返回了一个关联数组,而不是真正的“对象”。所以,我无法访问模型方法。假设我的 UserModel 类提供了一个名为“age”的方法,该方法根据用户的生日计算用户的当前年龄。在 Rails 中,我可以在视图上执行此操作:<%= @user.age %>。我需要在 Cake 上创建一个视图助手来执行此操作吗?像 calc_user_age($user); ?>(或类似的东西)?另一种情况:假设我想获取用户的最后一条评论,并在评论中使用帖子标题插入指向相关帖子的链接。在 Rails 中,我会执行类似 @user.comments.last.post.title 的操作来获取帖子标题。如果不使用获取大量不必要数据的“recursive=3”功能,我怎么能在 Cake 中做到这一点?

链接模型范围

假设我有一个名为 Post 的模型。在 Rails 中,我可以在模型上创建范围并按照我想要的方式混合它们。例如,如果我想获取“按访问最多的编程类别中最后发布的 5 个帖子”,我会这样称呼它们:“Post.published.from_category("programming").most_accessed.limit(5 )”。如果我只想要按最近排序的草稿帖子,并与分页集成,我会调用“Post.drafts.recent.page(2)”。在 CakePHP 上创建和链接作用域的最佳方法是什么?动态构建条件数组并将其作为“查找”的参数发送?

测试

CakePHP 社区采用了哪些测试工具?我需要测试模型及其方法,测试控制器及其响应和变量,测试视图内容(还有 Javascript 交互),创建固定装置等。我还想知道是否有办法创建类似自动测试的东西,在文件保存后运行测试。

嗯,基本上就是这些了。对不起,很长的帖子,以及我容易出错和多余的英语(我不是母语人士)。另外,我不是专家。所以,我可以在这里写一些错误的东西。

希望我们能好好谈谈。谢谢!

4

1 回答 1

12

Package management

AFAIK there is no up to date and wide used package manager. Usually we add plugins using git. Plugins are equal to gems in RoR I think.

Edit: There is now composer which is used by CakePHP now and a lot plugins.

Migrations

Use the CakeDC migrations plugin or the build in schema shell.

Automated Deployment

We use fabric. Afaik there is no plugin for cake that will do that I'm aware of.

Asset Compression

Use this plugin.

Namespaces for controllers

Simply put them into the controller folder and use the Router to create routes for them. Same way you describe it for Rails.

Access model methods from view

Eh? You do that in Rails? I dislike it. In CakePHP you should not do that and IMO not in any MVC application.

Set the data you need in the views from the controller.

$this->set('data', $this->Model->yourMethod()); 

Workers & Backround Jobs

This can be done by writing shells.

Chaining Models

Chaining models in CakePHP is done trough associations. And yes they would be accessible like $this->User->Post->find('first') for example. You can also build complex find queries and conditions over multiple tables.

Tests

CakePHP is using phpunit for unit testing. Read this section about it in the CakePHP book.

My recommendation

Read the book: book.cakephp.org It will definitely answer most of your questions and show you how to do thinks. The documentation quality of the 2.0 version is excellent.

于 2012-06-06T15:58:20.437 回答