Yii
是一个高性能,基于组件的 PHP 框架,用于快速开发现代 Web 应用程序。
今天,我本着体验 Yii2
的想法,准备使用 Yii2
从 0 到 1 来搭建一个 Todo List
,并完成以下功能:
- 可以基于某个
key
创建Todo Item
,然后根据key
查询对应的Todo Item
。 - 可以置顶、完成、删除单条
Todo Item
,置顶的Todo Item
将排列在最前面,完成的Todo Item
将排列在最后面。
初始化 YII 仓库
使用下面的命令即可初始化一个 YII
的仓库。
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
但是,我的 mac
通过这个方法老是连不上网络,安装某些依赖失败,所以这里选择第二种方式。(如下)
在 yiiframework 下载归档文件,然后解压到你要放置的项目目录中。
在下载解压完成后,需要先修改 config/web.php
文件,给 cookieValidationKey
配置项添加一个密钥(随便输入一个值就可以),以便项目能够正常启动。
在项目初始化完成以后,我们使用下面这个命令运行项目吧。
php yii serve --port=8888
然后我们打开 http://localhost:8888,看到我们的页面已经成功启动啦!(如下图)
初始化数据模型
接下来,我们来初始化我们的数据模型。
我们需要创建的字段有下面这些:
- id:自增主键;
- key:Todo 的 key;
- title:Todo 的标题;
- is_completed:Todo 是否完成;
- is_top:Todo 是否置顶;
- is_deleted:Todo 是否删除;
而上面这些字段中,我们最多的场景是通过 key
来捞出相关的 Todo Item
,所以应该给 key
建立一个普通索引。
综上,我们的 sql
语句应该是这样的:
CREATE TABLE IF NOT EXISTS `todos` (
`id` int PRIMARY KEY AUTO_INCREMENT,
`key` varchar(64) NOT NULL DEFAULT '',
`title` varchar(64) NOT NULL DEFAULT '',
`is_top` tinyint(1) NOT NULL DEFAULT 0,
`is_completed` tinyint(1) NOT NULL DEFAULT 0,
`is_deleted` tinyint(1) NOT NULL DEFAULT 0,
index `key`(`key`)
) engine=InnoDB CHARSET=utf8;
在数据库中执行该条 SQL
,创建对应的数据表。
然后,我们还可以通过下面这条语句查看我们创建的索引。
SHOW INDEX FROM `todos`;
处理 Todo 业务逻辑
在数据表创建成功后,我们就准备开始写 Todo
相关的业务逻辑了。
在此之前,我们还需要做一些 Yii
的配置初始化工作。
初始化 Yii 配置
首先,我们的 php
服务需要连接数据库,所以你需要先配置你的数据库连接,也就是 config/db.php
:
- 数据库配置
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=[mysql服务器地址];port=[mysql端口];dbname=[数据库名称]',
'username' => '[数据库用户名]',
'password' => '[数据库密码]',
'charset' => 'utf8',
'attributes' => [
// 查询时将 int 类型按原类型返回
PDO::ATTR_STRINGIFY_FETCHES => false,
PDO::ATTR_EMULATE_PREPARES => false
]
];
- URL 美化配置
然后,我们再来配置一下 URL
美化,这样就可以按照标准的 restful
风格进行访问了,调整 config/web.php
中的 urlManager
即可。(如下)
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => false,
'showScriptName' => false,
'rules' => [
],
],
- JSON 入参配置
然后,我们还需要修改一下 request
的配置,以便接受 application/json
的入参。
'components' => [
...
'request' => [
'parsers' => [
'application/json' => 'yii\web\JsonParser',
]
],
...
]
修改完了配置后,可以重启一下你的项目。
创建 TodoModel
+ TodoRepository
+ TodoService
+ TodoController
我们先来创建 Todo
的数据实体类 —— TodoModel
,这个模型将会贯穿 Todo List
的整个生命周期。
<?php
namespace app\models;
use Yii;
use Yii\base\Model;
class TodoModel extends Model {
public $id;
public $key;
public $title;
public $is_top;
public $is_completed;
public $is_deleted;
}
然后,我们创建 TodoRepository
,用于数据持久化。 —— SQL 写在这里。
<?php
namespace app\repositories;
use app\models\TodoModel;
class TodoRepository {
public static function