CakePHP 已经安装好,我们可以开始为 CMS 应用建立数据库了。首先建立一个
空的数据库,你可以使用任意的名字,比如 cake_cms
。执行以下 SQL 语句来建立需要的数据库表:
USE cake_cms;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL,
created DATETIME,
modified DATETIME
);
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
title VARCHAR(255) NOT NULL,
slug VARCHAR(191) NOT NULL,
body TEXT,
published BOOLEAN DEFAULT FALSE,
created DATETIME,
modified DATETIME,
UNIQUE KEY (slug),
FOREIGN KEY user_key (user_id) REFERENCES users(id)
) CHARSET=utf8mb4;
CREATE TABLE tags (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(191),
created DATETIME,
modified DATETIME,
UNIQUE KEY (title)
) CHARSET=utf8mb4;
CREATE TABLE articles_tags (
article_id INT NOT NULL,
tag_id INT NOT NULL,
PRIMARY KEY (article_id, tag_id),
FOREIGN KEY tag_key(tag_id) REFERENCES tags(id),
FOREIGN KEY article_key(article_id) REFERENCES articles(id)
);
INSERT INTO users (email, password, created, modified)
VALUES
('[email protected]', 'secret', NOW(), NOW());
INSERT INTO articles (user_id, title, slug, body, published, created, modified)
VALUES
(1, 'First Post', 'first-post', 'This is the first post.', 1, now(), now());
你也许已经注意到 articles_tags
表使用了复合主键。CakePHP 几乎支持所有的复合主键,这样便于你
使用比较简单的数据库结构,不用添加额外的 id
列。
以上所使用的数据表名以及列名都不是随意的。利用 CakePHP 的 命名约定, 我们可以更有效的使用并且避免了配置框架的需要。虽然 CakePHP 的灵活度可以容纳几乎所有的数据库结构, 但是采取约定,利用 CakePHP 提供的默认的约定可以节省你很多的开发时间,
接着我们需要告诉 CakePHP 我们之前创建的数据库地址以及如何连接。在 config/app.php 文件中,
找到 Datasources.default
数组,更改为相对应的值。以下的例子是一个完整的配置数组:
<?php
return [
// More configuration above.
'Datasources' => [
'default' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'host' => 'localhost',
'username' => 'cakephp',
'password' => 'AngelF00dC4k3~',
'database' => 'cake_cms',
'encoding' => 'utf8mb4',
'timezone' => 'UTC',
'cacheMetadata' => true,
],
],
// More configuration below.
];
一旦配置好你的 config/app.php 文件以后,你应该看到 ‘CakePHP is able to connect to the database’ 的部分也出现一个绿色厨师帽。
注解
一份默认的 CakePHP 配置文件可在 config/app.default.php 找到。
模型是一个 CakePHP 应用的核心。通过他们,我们能够读取以及修改数据。他们让我们可以将数据关联 起来,验证数据以及运用各种业务逻辑。模型是建立控制器的动作 (action) 和 模块(template)的基石。
CakePHP 的模型是由 Table
and Entity
两种对象组成。Table
为是一个特定的数据库表
的抽象。他们储存在 src/Model/Table 目录中。在本教程中,我们将建立文件
src/Model/Table/ArticlesTable.php。 完成的文件内容如下:
<?php
// src/Model/Table/ArticlesTable.php
namespace App\Model\Table;
use Cake\ORM\Table;
class ArticlesTable extends Table
{
public function initialize(array $config)
{
$this->addBehavior('Timestamp');
}
}
我们附属了 Timestamp 行为 (behavior)。此行为将会帮助我们自动填充
被附属的数据库表的 created
列 和 modified
列。利用 CakePHP 的命名约定,我们取其名为 ArticlesTable
,
这样 CakePHP 便可自动找到 articles
数据库表。同样利用命名约定,CakePHP 默认 id
为主键。
注解
如果一个模型的定义文件在 src/Model/Table 目录中缺失, CakePHP 会动态的建立一个模型对象。 这代表着,如果我们不小心写错文件名(比如错写成 articlestable.php 或者 ArticleTable.php), CakePHP 将无法读取你的设置,而是使用动态生成的模型。
我们也需要为 Articles 创建一个 Entity 的类。Entity 是数据库表中单个记录的抽象,它提供数据库行层面的 行为。在本教程中,我们将建立文件 src/Model/Entity/Article.php。 完成的文件内容如下:
<?php
// src/Model/Entity/Article.php
namespace App\Model\Entity;
use Cake\ORM\Entity;
class Article extends Entity
{
protected $_accessible = [
'*' => true,
'id' => false,
'slug' => false,
];
}
以上的 Entity 目前比较单一,我们仅仅建立了 _accessible
属性。它规定了此类的各种属性的控制规则
entities-mass-assignment。
目前为止,我们的模型都很简单,接下来我们将创建我们的第一个 控制器和模版。