热门标签 | 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 的基本原理,你可以试着通过运行 博客课程 ,看看它们是怎样一直工作的


推荐阅读
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 程序员妻子吐槽:丈夫北漂8年终薪3万,存款情况令人意外
    一位程序员的妻子在网上分享了她丈夫在北京工作八年的经历,月薪仅3万元,存款情况却出乎意料。本文探讨了高学历人才在大城市的职场现状及生活压力。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • This guide provides a comprehensive step-by-step approach to successfully installing the MongoDB PHP driver on XAMPP for macOS, ensuring a smooth and efficient setup process. ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 深入理解Java中的volatile、内存屏障与CPU指令
    本文详细探讨了Java中volatile关键字的作用机制,以及其与内存屏障和CPU指令之间的关系。通过具体示例和专业解析,帮助读者更好地理解多线程编程中的同步问题。 ... [详细]
  • 如何在PHPcms网站中添加广告
    本文详细介绍了在PHPcms网站后台添加广告的方法,涵盖多种常见的广告形式,如百度广告和Google广告,并提供了相关设置的步骤。同时,文章还探讨了优化网站流量的SEO策略。 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 理解存储器的层次结构有助于程序员优化程序性能,通过合理安排数据在不同层级的存储位置,提升CPU的数据访问速度。本文详细探讨了静态随机访问存储器(SRAM)和动态随机访问存储器(DRAM)的工作原理及其应用场景,并介绍了存储器模块中的数据存取过程及局部性原理。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • LeetCode 540:有序数组中的唯一元素
    来源:力扣(LeetCode),链接:https://leetcode-cn.com/problems/single-element-in-a-sorted-array。题目要求在仅包含整数的有序数组中,找到唯一出现一次的元素,并确保算法的时间复杂度为 O(log n) 和空间复杂度为 O(1)。 ... [详细]
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社区 版权所有