现在我们已经安装了CakePHP,让我们为我们的 CMS 应用程序设置数据库。如果您还没有这样做,请创建一个空数据库供本教程使用,可以自行选择名称,例如 cake_cms 。
如果您使用的是MySQL/MariaDB,您可以执行以下SQL语句来创建必要的表:
CREATE DATABASE cake_cms;
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
('cakephp@example.com', '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());
如果您使用的是PostgreSQL,请连接到 cake_cms 数据库并执行以下SQL语句:
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL,
created TIMESTAMP,
modified TIMESTAMP
);
CREATE TABLE articles (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL,
title VARCHAR(255) NOT NULL,
slug VARCHAR(191) NOT NULL,
body TEXT,
published BOOLEAN DEFAULT FALSE,
created TIMESTAMP,
modified TIMESTAMP,
UNIQUE (slug),
FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE tags (
id SERIAL PRIMARY KEY,
title VARCHAR(191),
created TIMESTAMP,
modified TIMESTAMP,
UNIQUE (title)
);
CREATE TABLE articles_tags (
article_id INT NOT NULL,
tag_id INT NOT NULL,
PRIMARY KEY (article_id, tag_id),
FOREIGN KEY (tag_id) REFERENCES tags(id),
FOREIGN KEY (article_id) REFERENCES articles(id)
);
INSERT INTO users (email, password, created, modified)
VALUES
('cakephp@example.com', '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.', TRUE, NOW(), NOW());
您可能已经注意到 articles_tags 表使用了复合主键。CakePHP几乎在每个地方都支持复合主键,这使您可以拥有更简单的模式,而无需额外的 id 列。
我们使用的表和列名不是任意的。通过使用CakePHP的 命名约定,我们可以更有效地利用CakePHP,并避免需要配置框架。虽然CakePHP足够灵活,可以适应几乎任何数据库模式,但遵循约定将节省您的时间,因为您可以利用CakePHP提供的基于约定的默认设置。
接下来,让我们告诉CakePHP我们的数据库在哪里以及如何连接到它。在 config/app_local.php 文件中,将 Datasources.default 数组中的值替换为适用于您的设置的值。一个示例的完成配置数组可能如下所示:
<?php
return [
// 更多配置...
'Datasources' => [
'default' => [
'className' => 'Cake\Database\Connection',
// 如果您使用的是PostgreSQL,请将Mysql替换为Postgres
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'host' => 'localhost',
'username' => 'cakephp',
'password' => 'AngelF00dC4k3~',
'database' => 'cake_cms',
// 如果您使用的是PostgreSQL,请注释掉下面的行
'encoding' => 'utf8mb4',
'timezone' => 'UTC',
'cacheMetadata' => true,
],
],
// 更多配置...
];
保存 config/app.php 文件后,您应该看到“CakePHP能够连接到数据库”部分显示为绿色的厨师帽。
Note
如果您的app文件夹中有 config/app_local.php 文件,则需要在该文件中配置数据库连接。
模型是CakePHP应用程序的核心。它们使我们能够读取和修改数据,构建数据之间的关系,验证数据并应用应用程序规则。模型提供了创建控制器操作和模板所需的基础。
CakePHP的模型由 Table 和 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): void
{
$this->addBehavior('Timestamp');
}
}
我们附加了 Timestamp 行为,它将自动填充我们表的 created 和 modified 列。通过将我们的Table对象命名为 ArticlesTable ,CakePHP可以使用命名约定,知道我们的模型使用 articles 表。CakePHP还使用约定知道 id 列是我们表的主键。
Note
如果CakePHP在 src/Model/Table 中找不到相应的文件,它将动态创建一个模型对象。这也意味着如果您错误地命名了文件(例如articlestable.php或ArticleTable.php),CakePHP将无法识别您的任何设置,并使用生成的模型。
我们还将为我们的Articles创建一个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 array $_accessible = [
'*' => true,
'id' => false,
'slug' => false,
];
}
目前,我们的实体非常简单;我们只设置了 _accessible 属性,它控制了如何通过 Mass Assignment 修改属性。
我们目前无法对模型进行太多操作。接下来,我们将创建我们的第一个 Controller和Template,以便与我们的模型进行交互。