1. CakePHP的基本结构
1.1 component(组件),controller公用的业务逻辑,比如说发邮件,可以调用EmailComponent来发送邮件,而不需要在单个的controller里面添加发邮件的代码。
1.2 Helper(助手类),与组件类似,主要用来帮助展示视图,比如用AjaxHelper来发Ajax请求,用HtmlHelper创建页面表单等。
1.3 Behavior(行为),是用来在模型之间加入共享功能。比如说系统使用LDAP来存储用户信息,那可以给user添加操作树形结构的behavior。CakePHP内置有Translate,Tree等行为。行为是通过模块类变量$actsAs来追加到模块里的。
1.4 路由 (Route),尽管不是类或文件,但它在 CakePHP 中扮演请求回应的角色。路由定义 CakePHP 如何对映 URL 与控制器动作之间的关系。默认的路由行为将 "/controller/action/var1/var2" 对映至 Controller::action($var1, $var2),但是你可以使用路由来自定 URL 以及它们如何对应你的应用。
2. CakePHP请求图
3. CakePHP目录结构
在你下载并且解压缩之后,在CakePHP目录下会看到这样一些文件和目录:
app
cake
vendors
.htaccess
index.php
README
你可以看到有三个主要的目录:
app目录将是你施展你的魔术之处:这是你放置你应用程式的地方。
cake资料夹是CakePHP核心模块,一般不要修改这个资料夹里的所有档案。
vendors资料夹是可以放置需要使用在你应用程式的第三方PHP函式库
CakePHP的app目录将是开发应用程式时最常使用的一个。就让我们来更仔细的看app资料夹里面有些什么
4. 文件及类命名规则(重要)
4.1 数据库表名为复数,所有的表必须有一个名为id的字段,并且id字段为主键(CakePHP识别数据更新还是插入依赖此ID,还有表之间的关联也依赖此ID)。外键在hasMany、belongsTo或hasOne关系中随着相关模型在之后加上_id是被认可的。所以如果一个糕点师有许多饼乾,饼乾这个数据表透过baker_id外键将参考到糕点师这个数据表。多个字母的表名使用下划线分割并加上id。如category_type_id 是category_types的外键。结合数据表,使用hasAndBelongsToMany (HABTM)关系在模型之间的命名方式必需依照字母先后次序(是apples_zebras而不是zebras_apples). CakePHP是不支持复合主键的,需要添加一个额外的id作为单一主键。
4.2 所有的model文件到放在app/models目录下面。并且文件名为数据表名的单数形式,注意文件名全是小写,如果有多个用下划线分割。类名也是单数,且类名首字母大写,如果多个则按照驼峰式命名。所有的models必须继承AppModel或者其子类。AppModel继承自Model,在Model类中定义了数据操作。在Model中一般会定义一个name的变量,其值为类名。这不是必须的,CakePHP会自动配置,不过手动添加会比较好,在应用的时候会比较明确。
4.3 所有的controller文件到放在app/controllers目录下面。并且文件名为数据表加下划线加controller,注意文件名全是小写,如果有多个用下划线分割。类名为表名加上Controller,且类名首字母大写,如果多个则按照驼峰式命名。所有的controller必须继承Controller或者其子类。和Model一样,在Controller中一般会定义一个name的变量,其值为表名。这不是必须的,CakePHP会自动配置,不过手动添加会比较好。Model名字是单数,controller名字是复数,不难理解,一个controller对应的是很多model。如果一个controller类名加了下划线则其之类内部使用,不能通过URL来访问。 对于多个字母的controller,最后用下划线分割的小写url来访问。如/red_apples/go_pick是正确命名格式去访问RedApplesController::go_pick action
4.4 所有的view都放在app/views目录下面,一个controller对应一个文件夹,文件夹的名字和控制器名字一样,只是不加controller,换句话说和数据表名字一样。如果有名字有多个单词,要用下划线来分隔。在此文件夹下面有controller中action对应的文件,文件名和action一致,文件后缀为ctp,即cake template pages. 如果页面没有对应的action,只需要创建ctp文件并放在app/views/pages下面。 如果没有指定路由,CakePHP会把app/views/pages/home.ctp作为默认页面。对于多个字母的action,则使用下划线分割。如PeopleController 中 getPeady() 函数将调用对应的视图文件 /app/views/people/get_ready.ctp
4.5 文件及类名称命名规则
一般来说,文件名是由下划线将单词分开,但是类名通常使用驼峰命名法。如下面例子。
控制器类KissesAndHugsController会被命名为 kisses_and_hugs_controller.php (注意文件名中的_controller)
组件类MyHandyComponent会被命名为 my_handy.php
模型类OptionValue会被命名为 option_value.php
行为类EspeciallyFunkableBehavior会被命名为 especially_funkable.php
视图类SuperSimpleView会被命名为 super_simple.php
助手类BestEverHelper会被命名为 best_ever.php
下面最后一个例子是关系约定:
数据库表: "people"
模型类: "Person",创建 /app/models/person.php控制器类: "PeopleController",创建 /app/controllers/people_controller.php
视图文件, 创建 /app/views/people/index.ctp
使用这些约定,CakPHP就知道 http://example.com/people/ 这个请求需要去调用PeopleController中的index()函数,Person的数据模型是自动有效的(自动与数据库中的 ‘people’表关联),并将其渲染到对应的视图文件。没有一个关联是已经被配置的,你可以根据自己的需要来创建。