咱们是约定优于配置的忠实信徒。花费不多的时间来学习 CakePHP 的约定,长远来看,会节省你的时间:经过遵循约定,你可以得到免费的功能,而且能够从维护和追踪配置文件的梦魇中解脱。约定还形成了系统开发的统一性,使其余程序员更易于加入和提供帮助。 php
CakePHP 约定提炼于多年的 web 开发经验和最佳实践。 咱们建议你在用 CakePHP 编程时使用这些约定,可是咱们也要说明这些原则很容易覆盖 —— 在与遗留的系统一同工做时,有些东西很是有用。 程序员
控制器类名是复数的、驼峰格式,而且使用 Controller 结尾。 PeopleController 和 LatestArticlesController 都是约定类名的例子。 web
为控制器编写的第一个方法极可能是 index() 方法。 当只指定了控制器,但没有指定动做(action)时,CakePHP 的默认行为是执行这个控制器的 index() 方法。 例如: http://www.example.com/apples/ 请求会调用ApplesController 的 index() 方法,而 http://www.example.com/apples/view/ 会调用 ApplesController 的 view 方法。 数据库
在 CakePHP 中,你还能够经过在控制器方法的名称前添加下划线来改变其可见性。 若是一个控制器方法以一个下划线开头,这个方法将不能经过 web 访问,但能够在内部使用。例如: 编程
1 class NewsController extends AppController { 2 3 public function latest() { 4 $this->_findNewArticles(); 5 } 6 7 protected function _findNewArticles() { 8 // Logic to find latest news articles 9 } 10 }
用 户能够象一般那样访问 http://www.example.com/news/latest/ , 一些人尝试访问http://www.example.com/news/_findNewArticles/ 就会获得一个错误, 由于这个方法是如下划线开头的。 你还可使用 PHP 的可见性关键词来指定一个方法是否能经过 url 访问。非公有的方法将不能被访问。 app
正像你看到的那样,单个单词命名的控制器简单容易的用小写的 URL 路径访问,ApplesController (在 ‘ApplesController.php’ 定义的)能够经过 http://example.com/apples 访问。 函数
多个单词组成的控制器 能 被下面的几种功能相同的方法任意扭曲: 工具
都将解析为 RedApples 控制器的 index 方法。可是这个约定是你的 url 是小写加下划线,所以 /red_apples/go_pick 能够正确的访问 RedApplesController::go_pick 动做。 post
关于 CakePHP URL 的更多信息和参数处理,参见 路由配置 。 学习
一般,文件名和类名是相匹配的,也遵照驼峰规则。所以在 Cake里,若是你的类名是 MyNiftyClass,对应的文件名就是 MyNiftyClass.php。 下面的例子是关于如何为 CakePHP 应用程序中不一样类型的类所在的文件命名的经典规则:
每一个文件都存放在 app 文件夹的相应子文件夹中。
模型类是单数、驼峰式的。Person、BigPerson 和 ReallyBigPerson 都是符合约定的模型命名实例。
表名与 CakePHP 的模型一致,是单数的,用下划线间隔单词的。表 people、 big_people 和 really_big_people 分别对应上面说起的模型。
可使用工具库 弯曲 检验单词的单/复数形式。更多信息参见 弯曲 。
两个以上单词构成的域名用下划线间隔,如 first_name 。
hasMany、 belongsTo 或者 hasOne 关系中的外键默认是用关系表名带 _id 来识别。 因此,若是 Baker hasMany Cake,cake 表将使用 baker_id 外键引用 baker 表。对于多个单词构成的表,例如 category_types,外键就是 category_type_id 。
在模型间使用 hasAndBelongsToMany (HABTM) 关系链接表,其命名将按照字母顺序(apples_zebras 优先于 zebras_apples)。
每一个 CakePHP 模型中的全部表(包括指望链接的表),仅包含单域主键用于惟一标识一个行。 也许你但愿模型表没有单域主键,但 CakePHP 约定要求表加入一个单域主键。若是你想使用表模型,就必须加入一个单域主键。
CakePHP 不支持多域主键。若是你想要直接控制你的链接表数据,使用 query 调用或者按照默认模式加入一个单域主键。例如:
1 CREATE TABLE posts_tags ( 2 id INT(10) NOT NULL AUTO_INCREMENT, 3 post_id INT(10) NOT NULL, 4 tag_id INT(10) NOT NULL, 5 PRIMARY KEY(id));
相对于使用 auto-increment 键做为主键,你还可使用 char(36) 类型。Cake 将在你使用 Model::save 方法保存一条记录时使用惟一的 36 个字节的 uuid (String::uuid) 。
视图模板文件是用控制器的函数命名的,用下划线间隔多个单词。PeopleController 类的 getReady() 函数的视图模板是 /app/View/People/get_ready.ctp。
基本的模式是 /app/View/Controller/underscored_function_name.ctp。
若是使用 CakePHP 约定命名你的应用程序片段,你不须要维护配置就能够得到须要的功能。这是遵循约定的最终实例:
使 用这些约定,Cakephp 知道 http://example.com/people/ 请求是要调用 PeopleController 类的 index() 函数,Person 模型自动有效(而且自动绑定到数据库的‘people’表)并渲染一个文件。这些关系彻底不须要配置,你只须要创建相应的文件便可。
如今,你已经了解了 CakePHP 的基本原理,你能够试着经过运行 博客课程 ,看看它们是怎样一直工做的。