CMS 教程 - 创建数据库
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 ('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());
你也许已经注意到 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’ 的部分也出现一个绿色厨师帽。
Note
一份默认的 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
为主键。
Note
如果一个模型的定义文件在 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。
目前为止,我们的模型都很简单,接下来我们将创建我们的第一个 控制器和模版。