我们非常支持约定优于配置的理念。虽然学习CakePHP的约定可能需要一些时间,但从长远来看可以节省时间。通过遵循约定,您可以获得免费的功能,并摆脱跟踪配置文件的维护困扰。约定还可以提供一致的开发体验,使其他开发人员能够轻松参与和协助。
控制器类名是复数形式的、驼峰命名,并以 Controller 结尾。 UsersController 和 MenuLinksController 都是常见的控制器命名示例。
控制器上的公共方法通常作为可通过Web浏览器访问的“操作”公开。它们使用驼峰命名法。例如,默认情况下, /users/view-me 映射到 UsersController 的 viewMe() 方法(如果在路由中使用默认的短划线拼写)。
正如您刚才看到的,单词控制器映射到一个简单的小写URL路径。例如, UsersController (在文件名**UsersController.php**中定义)可以从 http://example.com/users 访问。
虽然您可以以任何方式路由多个单词的控制器,但约定是使用 DashedRoute 类,使用小写和破折号的URL。因此, /menu-links/view-all 是访问 MenuLinksController::viewAll() 操作的正确形式。
当您使用 $this->Html->link() 创建链接时,可以使用以下约定的URL数组:
$this->Html->link('链接标题', [
'prefix' => 'MyPrefix' // 驼峰命名
'plugin' => 'MyPlugin', // 驼峰命名
'controller' => 'ControllerName', // 驼峰命名
'action' => 'actionName' // 驼峰命名
]
有关CakePHP的URL和参数处理的更多信息,请参阅:ref:routes-configuration。
一般来说,文件名与类名相匹配,并遵循PSR-4标准进行自动加载。以下是一些类名及其文件名的示例:
控制器类 LatestArticlesController 应该在名为**LatestArticlesController.php**的文件中找到。
组件类 MyHandyComponent 应该在名为**MyHandyComponent.php**的文件中找到。
表类 OptionValuesTable 应该在名为**OptionValuesTable.php**的文件中找到。
实体类 OptionValue 应该在名为**OptionValue.php**的文件中找到。
行为类 EspeciallyFunkableBehavior 应该在名为**EspeciallyFunkableBehavior.php**的文件中找到。
视图类 SuperSimpleView 应该在名为**SuperSimpleView.php**的文件中找到。
助手类 BestEverHelper 应该在名为**BestEverHelper.php**的文件中找到。
每个文件都应位于您的应用程序文件夹中适当的文件夹/命名空间中。
与CakePHP模型对应的表名是复数形式的,并使用下划线分隔。例如, users 、 menu_links 和 user_favorite_pages 分别对应表名。名字包含多个单词的表名只应该将最后一个单词变为复数形式,例如, menu_links 。
两个或多个单词的列名使用下划线分隔,例如, first_name 。
在hasMany、belongsTo/hasOne关系中,外键默认被识别为相关表的(单数)名称后跟 _id 。因此,如果Users hasMany Articles, articles 表将通过 user_id 外键引用 users 表。对于包含多个单词的表(如 menu_links ),外键将是 menu_link_id 。
在模型之间的BelongsToMany关系中使用连接(或“联接”)表。这些表的命名应与它们连接的表名相对应。名称应该是复数形式,并按字母顺序排序: articles_tags ,而不是 tags_articles 或 article_tags 。*如果不遵循此约定,bake命令将无法正常工作。*如果联接表除了链接外键之外还包含其他数据,您应该为该表创建一个具体的实体/表类。
除了使用自增整数作为主键,您还可以使用UUID列。CakePHP会在使用 Table::save() 方法保存新记录时自动创建UUID值,使用(Cake\Utility\Text::uuid())方法。
表类名是复数形式的、驼峰命名,并以 Table 结尾。 UsersTable 、 MenuLinksTable 和 UserFavoritePagesTable 都是与表名 users 、 menu_links 和 user_favorite_pages 相匹配的表类名的示例。
实体类名是单数的驼峰命名,没有后缀。 User 、 MenuLink 和 UserFavoritePage 都是与表名 users 、 menu_links 和 user_favorite_pages 相匹配的实体类名的示例。
视图模板文件的命名方式是根据它们所显示的控制器函数,使用下划线形式。 ArticlesController 类的 viewAll() 函数将在**templates/Articles/view_all.php**中查找视图模板。
基本模式是**templates/Controller/下划线形式的函数名.php**。
在包名中为CakePHP插件添加前缀“cakephp-”是有用的,这样名称在语义上与所依赖的框架相关联。
不要使用CakePHP命名空间(cakephp)作为供应商名称,因为这是CakePHP拥有的插件保留的。约定是使用小写字母和破折号作为分隔符:
// 不好的示例
cakephp/foo-bar
// 好的示例
your-name/cakephp-foo-bar
有关详细信息,请参阅`awesome list recommendations <https://github.com/FriendsOfCake/awesome-cakephp/blob/master/CONTRIBUTING.md#tips-for-creating-cakephp-plugins>`__。
通过使用CakePHP的约定命名应用程序的各个部分,您可以获得功能,而无需配置的麻烦和维护的束缚。以下是将这些约定联系在一起的最后一个示例:
数据库表: articles 、 menu_links
表类: ArticlesTable ,位于**src/Model/Table/ArticlesTable.php**
实体类: Article ,位于**src/Model/Entity/Article.php**
控制器类: ArticlesController ,位于**src/Controller/ArticlesController.php**
视图模板,位于**templates/Articles/index.php**
使用这些约定,CakePHP知道对 http://example.com/articles 的请求映射到 ArticlesController 的 index() 方法,其中 Articles 模型会自动可用。除了创建您需要创建的类和文件之外,没有通过其他方式配置这些关系。
现在您已经了解了CakePHP的基本知识,可以尝试运行 :doc:`/tutorials-and-examples/cms/installation`来了解它们如何结合在一起。