热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CakePHP2.xCookBook中文版第三章入门之约定

视图模板文件是用控制器的函数命名的,用下划线间隔多个单词。PeopleController类的getReady()函数的视图模板是/app/View/People/get_ready.ctp。

CakePHP 约定

我们是约定优于配置的忠实信徒。花费很少的时间来学习 CakePHP 的约定,长远来看,会节省你的时间:通过遵循约定,你能够获得免费的功能,并且可以从维护和追踪配置文件的梦魇中解脱。约定还造成了系统开发的统一性,使其他程序员更易于加入和提供帮助。

CakePHP 约定提炼于多年的 web 开发经验和最佳实践。 我们建议你在用 CakePHP 编程时使用这些约定,但是我们也要说明这些原则很容易覆盖 —— 在与遗留的系统一同工作时,有些东西非常有用。

控制器约定

控制器类名是复数的、驼峰格式,并且使用 Controller 结尾。 PeopleController 和 LatestArticlesController 都是约定类名的例子。

为控制器编写的第一个方法很可能是 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 访问。非公有的方法将不能被访问。

关于控制器命名的思考

正像你看到的那样,单个单词命名的控制器简单容易的用小写的 URL 路径访问,ApplesController (在 ‘ApplesController.php’ 定义的)可以通过 http://example.com/apples 访问。

多个单词组成的控制器  被下面的几种功能相同的方法任意扭曲:

  • /redApples
  • /RedApples
  • /Red_apples
  • /red_apples

都将解析为 RedApples 控制器的 index 方法。但是这个约定是你的 url 是小写加下划线,因此 /red_apples/go_pick 可以正确的访问 RedApplesController::go_pick 动作。

关于 CakePHP URL 的更多信息和参数处理,参见 路由配置 。

文件名和类名约定

通常,文件名和类名是相匹配的,也遵守驼峰规则。因此在 Cake里,如果你的类名是 MyNiftyClass,对应的文件名就是 MyNiftyClass.php。 下面的例子是关于如何为 CakePHP 应用程序中不同类型的类所在的文件命名的经典规则:

  • 控制器类 KissesAndHugsController 存储在 KissesAndHugsController.php 文件中
  • 组件类 MyHandyComponent 存储在 MyHandyComponent.php 文件中
  • 模型类 OptionValue 存储在 OptionValue.php 文件中
  • 行为类 EspeciallyFunkableBehavior 存储在 EspeciallyFunkableBehavior.php 文件中
  • 视图类 SuperSimpleView 存储在 SuperSimpleView.php 文件中
  • 助手类 BestEverHelper 存储在 BestEverHelper.php 文件中

每个文件都存放在 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 约定命名你的应用程序片断,你不需要维护配置就可以获得需要的功能。这是遵循约定的最终实例:

  • 数据库表: “people”
  • 模型类: “Person”,在 /app/Model/Person.php 文件中
  • 控制器类: “PeopleController”,在 /app/Controller/PeopleController.php 文件中
  • 视图模板,在 /app/View/People/index.ctp 文件中

使用这些约定,Cakephp 知道 http://example.com/people/ 请求是要调用 PeopleController 类的 index() 函数,Person 模型自动有效(并且自动绑定到数据库的‘people’表)并渲染一个文件。这些关系完全不需要配置,你只需要建立相应的文件即可。

现在,你已经了解了 CakePHP 的基本原理,你可以试着通过运行 博客课程 ,看看它们是怎样一直工作的


推荐阅读
  • 基于函数实现的进制转换工具
    本文介绍了一种利用函数实现不同进制数(二进制、八进制、十进制)之间转换的方法。包括了程序的运行效果展示、所使用的主要函数解析、以及如何验证用户输入的合法性。整个项目仅使用了两个全局变量来存储用户的选项和输入的数值。 ... [详细]
  • CSGO
    CSGOTimeLimit:40002000MS(JavaOthers)MemoryLimit:524288524288K(JavaOthers)ProblemDescriptio ... [详细]
  • 掌握Python岗位,你需要了解的关键技能
    最近,在社交平台脉脉上,一条关于Python岗位的消息引起了广泛关注。本文将探讨Python岗位的实际价值,并深入解析阿里巴巴等大公司在面试Python开发者时常见的问题。 ... [详细]
  • 深入解析PHP Xdebug的安装与应用
    本文详细介绍了PHP Xdebug的安装步骤及其在PHP开发中的重要作用。Xdebug作为一款强大的调试工具,不仅能够帮助开发者追踪代码执行过程,还能有效提升代码质量和系统性能。 ... [详细]
  • CGroups: 资源管理和控制
    CGroups(Control Groups)是Linux内核提供的一个功能,旨在限制、记录和隔离进程组使用的物理资源,如CPU、内存和I/O等。它通过精细的资源管理,支持现代容器技术如Docker的资源限制需求。 ... [详细]
  • Kafka 示例项目中 Log4j 的配置与调试
    本文详细介绍了如何在 Kafka 源码中的示例项目配置 Log4j,以确保能够正确记录日志信息,帮助开发者更好地理解和调试代码。 ... [详细]
  • Django框架的使用教程mysql数据库[三]
    Django的数据库1.在Django_test下的view.py里面model定义模型fromdjango.dbimportmodels#Createyourmodelshere ... [详细]
  • 本文探讨了梯形图为何成为嵌入式软件机器编程中的理想选择,分析其特点及优势。 ... [详细]
  • 致信息安全爱好者的成长指南
    本文旨在为信息安全爱好者提供一份详尽的成长指南,涵盖从学习心态调整到具体技能提升的各个方面。 ... [详细]
  • 使用Adobe Illustrator打造独特的家族徽章:牡鹿图腾设计教程
    本文详细介绍了一种基于《权力的游戏》灵感,运用Adobe Illustrator创作独特家族图腾——牡鹿徽章的方法。本教程不仅展示了具体的步骤,还提供了多种技巧,帮助读者创作出既具个人特色又符合设计原则的作品。 ... [详细]
  • 解析程序员与软件工程师的角色差异
    本文深入探讨了程序员与软件工程师之间的主要区别,包括它们的职业定位、技能要求以及工作内容等方面的不同,旨在帮助读者更好地理解这两个角色的特点。 ... [详细]
  • Android json字符串转Map
    Androidjson字符串转Map,Go语言社区,Golang程序员人脉社 ... [详细]
  • 每位开发者都应该拥有一个展示自我技能与分享知识的空间——个人技术博客。本文将指导你如何使用静态网站生成器Hexo结合GitHub Pages搭建这样一个平台。 ... [详细]
  • 解决CSS因MIME类型不匹配导致的加载失败问题
    本文详细介绍了在Web开发过程中,遇到CSS文件因MIME类型不匹配而无法正确加载的问题及其解决方案,适合前端开发者阅读。 ... [详细]
  • 深入浅出:Java面向对象编程
    本文详细介绍了Java语言的核心特性——面向对象编程。探讨了Java的基本概念、平台无关性、丰富的内置类库及安全性,同时深入解析了类加载器、垃圾回收机制以及基本数据类型和其包装类。 ... [详细]
author-avatar
Andg在路上
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有