最近一直忙其它的(其实是懒!),将《深入理解Yii2》看了一遍,一些当初没明白的稍微明了了点,然后又看yii2的图片上传等处理、富文本、restful什么的,但由于没进行到这里,只看也不管用啊,所以还是按照步骤一步步来,先说说前后台分离。(其实普通的内容管理站点用不着下面所说的彻底分离什么的,看看也无妨)
个人感觉前后台的情况有这么几种,首先是前后台是否是用一个验证体系,其次是前后台是否共用一个数据表。
一般来说下面三种比较常用吧:
A、共用一个验证体系和一个数据表。
B、两个验证体系和共用一个数据表。
C、两个验证体系和两个数据表。
Yii2高级版里面默认是A类型,即数据表一样,且一边登录/登出了,另一边也同样登录/登出,感觉这种结构比较适用于论坛这种,管理员也需要有与会员一样发帖回帖等功能,表字段也基本一致,(个人这样认为,毕竟接触的不多,网上也搜过不同的后台构建的话题,但是很少有详细讨论的),这种可以通过字段、权限等来区分前后台。而我们将要做的是C类型,像是一些电商网站,后台的管理员和前台的会员功能就相差太大了,且表字段差别也大,所以验证体系不一样,而且放两个数据表比较好。至于B类型算是C类型的简化版,C如果会设置的话,B也同理。
那我们先建立一个admin表,用来存放管理员数据,而会员仍然用原有的user表,这里用yii的migrate来创建,在Yii2初始化章节中有提到过,这里稍微详细说下:
1、yii2版本2.07以前用命令,即可在console/migrations目录下创建一个php文件,然后在此文件下编写创建表语句等等就可以了。
yii migrate/create admin
2、yii2版本2.07后,增加了更细致的分类,例如我已经创建了admin表,但少了一个status字段,那我可以直接用下面命令便会生成只增加字段的文件
yii migrate/create add_column_to_admin --fields=status:int(10):nontNull
生成:
<?php use yii\db\Migration; class m160501_053640_add_column_to_admin extends Migration { public function up() { $this->addColumn('admin', 'status', $this->int(10)->nontNull()); } public function down() { $this->dropColumn('admin', 'status'); } }
具体为什么会这样,我们看下原代码,在vendor/yiisoft/yii2/console/BaseMigrateController.php文件的actionCreate方法中:
} elseif (preg_match('/^add_(. )_to_(. )$/', $name, $matches)) { $content = $this->renderFile(Yii::getAlias($this->generatorTemplateFiles['add_column']), [ 'className' => $className, 'table' => mb_strtolower($matches[2], Yii::$app->charset), 'fields' => $this->fields ]); }
我们可以看到,这里是正则匹配add_xxx_to_xxx来确定具体是指向哪个模板,从而生成不同的样式。
根据migrate/create后面的参数总共匹配这几种样式:
1、create_junction_表名_and_表名,用来创建联结表
2、add_xxx_to_表名,用来增加字段(可以用--fields样式指定一个字段,否则生成空的,需要自己写,当然也可以改模板添加个注释示例)
3、drop_xxx_from_表名,用来删除字段(同上)
4、create_表名,用来创建表
5、drop_表名,用来删除表
注:可以直接在控制台用yii help migrate来查看更多的用法
模板文件可以在vendor/yiisoft/yii2/views中找到对应的,如果想更改模板,让其更适合自己的操作,可以这样:
在console文件中新建views文件夹,将上方的你想修改的模板复制到这里来修改,然后再console/config/main.php中修改
return [ //修改migration模板 'controllerMap' => [ 'migrate' => [ 'class' => 'yii\console\controllers\MigrateController', 'templateFile'=>'@yii/views/migration.php',//默认模板,2.07后应该很少用了 'generatorTemplateFiles' => [ 'create_table' => '@console/views/createTableMigration.php',//修改的 'drop_table' => '@yii/views/dropTableMigration.php',//未修改的 'add_column' => '@console/views/addColumnMigration.php',//修改的 'drop_column' => '@console/views/dropColumnMigration.php',//修改的 'create_junction' => '@yii/views/createJunctionMigration.php'//未修改的 ], ], ], ];
值得注意的是generatorTemplateFiles配置中,必须将这5个都写全了,如果不修改,则写原来的路径,原来的路径可在vendor/yiisoft/yii2/console/MigrateController.php中查看,否则你用到没写的那个命令模板的时候就会报错。
至于如何写具体的创建表、添加字段等语句,其实也有版本不同(2.06新写法)的两种写法,这里就不要看中文版的没有更新的yii2指南了,直接看英文更新的,点这里,里面包含上面说的内容加具体的写法。当初费了很多时间google搜索、顺着源码看才搞明白上面说的原理,后来一看,在人家英文版里都写了,悲剧,而且最近我在Yii英文官网api文档搜索任何关键字都不出现结果了,不知道是这边的问题还是官网问题,只能对照着中文指南和英文指南看到底是对应的哪一块。所以说如果英语更好点就好了,直接看英文文档。
目前自己修改了create_table时加表注释、段注释(这个搜索及查源码没找到类似->comment的写法,可能是为了兼容其它数据库,所以只能拼接,而写段注释的好处是,gii 生成model时attributeLabels方法可以直接根据注释来显示对应的中文名字),add_column和drop_column模板增加一个示例注释,方便忘了用法时参照注释的示例来写,而且这样就不用加--fileds参数了。呃,这里贴一下自己的模板和最终应该建立的admin表的语句吧:
模板createTableMigration.php:
<?php /** * This view is used by console/controllers/MigrateController.php * The following variables are available in this view: */ /* @var $className string the new migration class name */ /* @var $table string the name table */ /* @var $fields array the fields */ echo "<?php\n"; ?> use yii\db\Migration; class <?= $className ?> extends Migration { const TBL_NAME = '{{%<?=$table?>}}'; public function up() { $tableOptions = null; if ($this->db->driverName === 'mysql') { $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE=InnoDB COMMENT="填写表注释"'; } $this->createTable(self::TBL_NAME, [ <?php foreach ($fields as $field): ?> <?php if ($field == end($fields)): ?> '<?= $field['property'] ?>' => $this-><?= $field['decorators'].".\" COMMENT '填写段注释'\"" . "\n"?> <?php else: ?> '<?= $field['property'] ?>' => $this-><?= $field['decorators'].".\" COMMENT '填写段注释'\"" . ",\n"?> <?php endif; ?> <?php endforeach; ?> ],$tableOptions); } public function down() { $this->dropTable(self::TBL_NAME); } }
具体语句m160326_133655_create_admin.php:
<?php use yii\db\Migration; class m160427_133556_create_admin extends Migration { const TBL_NAME = '{{