《PHP編程:Yii2前后臺分離及migrate使用(七)》要點(diǎn):
本文介紹了PHP編程:Yii2前后臺分離及migrate使用(七),希望對您有用。如果有疑問,可以聯(lián)系我們。
相關(guān)主題:YII框架
最近一直忙其它的(其實(shí)是懶!),將《深入理解Yii2》看了一遍,一些當(dāng)初沒明白的稍微明了了點(diǎn),然后又看yii2的圖片上傳等處理、富文本、restful什么的,但由于沒進(jìn)行到這里,只看也不管用啊,所以還是依照步驟一步步來,先說說前后臺分離.(其實(shí)普通的內(nèi)容管理站點(diǎn)用不著下面所說的徹底分離什么的,看看也無妨)
PHP學(xué)習(xí)
個人感覺前后臺的情況有這么幾種,首先是前后臺是否是用一個驗(yàn)證體系,其次是前后臺是否共用一個數(shù)據(jù)表.PHP學(xué)習(xí)
一般來說下面三種比擬常用吧:
PHP學(xué)習(xí)
A、共用一個驗(yàn)證體系和一個數(shù)據(jù)表.
PHP學(xué)習(xí)
B、兩個驗(yàn)證體系和共用一個數(shù)據(jù)表.
PHP學(xué)習(xí)
C、兩個驗(yàn)證體系和兩個數(shù)據(jù)表.
PHP學(xué)習(xí)
Yii2高級版里面默認(rèn)是A類型,即數(shù)據(jù)表一樣,且一邊登錄/登出了,另一邊也同樣登錄/登出,感覺這種結(jié)構(gòu)比擬適用于論壇這種,管理員也需要有與會員一樣發(fā)帖回帖等功能,表字段也基本一致,(個人這樣認(rèn)為,畢竟接觸的不多,網(wǎng)上也搜過不同的后臺構(gòu)建的話題,但是很少有詳細(xì)討論的),這種可以通過字段、權(quán)限等來區(qū)分前后臺.而我們將要做的是C類型,像是一些電商網(wǎng)站,后臺的管理員和前臺的會員功能就相差太大了,且表字段差別也大,所以驗(yàn)證體系不一樣,而且放兩個數(shù)據(jù)表比擬好.至于B類型算是C類型的簡化版,C如果會設(shè)置的話,B也同理.
PHP學(xué)習(xí)
那我們先建立一個admin表,用來存放管理員數(shù)據(jù),而會員仍然用原有的user表,這里用yii的migrate來創(chuàng)建,在Yii2初始化章節(jié)中有提到過,這里稍微詳細(xì)說下:
PHP學(xué)習(xí)
1、yii2版本2.07以前用命令,即可在console/migrations目錄下創(chuàng)建一個php文件,然后在此文件下編寫創(chuàng)建表語句等等就可以了.
PHP學(xué)習(xí)
yii migrate/create admin
PHP學(xué)習(xí)
2、yii2版本2.07后,增加了更細(xì)致的分類,例如我已經(jīng)創(chuàng)建了admin表,但少了一個status字段,那我可以直接用下面命令便會生成只增加字段的文件
PHP學(xué)習(xí)
yii migrate/create add_column_to_admin --fields=status:int(10):nontNull
PHP學(xué)習(xí)
生成:
PHP學(xué)習(xí)
<?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辦法中:PHP學(xué)習(xí)
} 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來確定具體是指向哪個模板,從而生成不同的樣式.PHP學(xué)習(xí)
根據(jù)migrate/create后面的參數(shù)總共匹配這幾種樣式:
PHP學(xué)習(xí)
1、create_junction_表名_and_表名,用來創(chuàng)建聯(lián)結(jié)表
PHP學(xué)習(xí)
2、add_xxx_to_表名,用來增加字段(可以用--fields樣式指定一個字段,否則生成空的,需要本身寫,當(dāng)然也可以改模板添加個注釋示例)
PHP學(xué)習(xí)
3、drop_xxx_from_表名,用來刪除字段(同上)
PHP學(xué)習(xí)
4、create_表名,用來創(chuàng)建表
PHP學(xué)習(xí)
5、drop_表名,用來刪除表
PHP學(xué)習(xí)
注:可以直接在控制臺用yii help migrate來查看更多的用法
PHP學(xué)習(xí)
模板文件可以在vendor/yiisoft/yii2/views中找到對應(yīng)的,如果想更改模板,讓其更適合本身的操作,可以這樣:
PHP學(xué)習(xí)
在console文件中新建views文件夾,將上方的你想修改的模板復(fù)制到這里來修改,然后再console/config/main.php中修改
PHP學(xué)習(xí)
return [ //修改migration模板 'controllerMap' => [ 'migrate' => [ 'class' => 'yii\console\controllers\MigrateController', 'templateFile'=>'@yii/views/migration.php',//默認(rèn)模板,2.07后應(yīng)該很少用了 '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中查看,否則你用到?jīng)]寫的那個命令模板的時候就會報錯.
PHP學(xué)習(xí)
至于如何寫具體的創(chuàng)建表、添加字段等語句,其實(shí)也有版本不同(2.06新寫法)的兩種寫法,這里就不要看中文版的沒有更新的yii2指南了,直接看英文更新的,點(diǎn)這里,里面包括上面說的內(nèi)容加具體的寫法.當(dāng)初費(fèi)了很多時間google搜索、順著源碼看才搞明白上面說的原理,后來一看,在人家英文版里都寫了,悲劇,而且最近我在Yii英文官網(wǎng)api文檔搜索任何關(guān)鍵字都不出現(xiàn)結(jié)果了,不知道是這邊的問題還是官網(wǎng)問題,只能對照著中文指南和英文指南看到底是對應(yīng)的哪一塊.所以說如果英語更好點(diǎn)就好了,直接看英文文檔.
PHP學(xué)習(xí)
目前自己修改了create_table時加表注釋、段注釋(這個搜索及查源碼沒找到類似->comment的寫法,可能是為了兼容其它數(shù)據(jù)庫,所以只能拼接,而寫段注釋的好處是,gii 生成model時attributeLabels辦法可以直接根據(jù)注釋來顯示對應(yīng)的中文名字),add_column和drop_column模板增加一個示例注釋,方便忘了用法時參照注釋的示例來寫,而且這樣就不用加--fileds參數(shù)了.呃,這里貼一下自己的模板和最終應(yīng)該建立的admin表的語句吧:
PHP學(xué)習(xí)
模板createTableMigration.php:
PHP學(xué)習(xí)
<?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學(xué)習(xí)
<?php use yii\db\Migration; class m160427_133556_create_admin extends Migration { const TBL_NAME = '{{%admin}}'; 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, [ 'id' => $this->primaryKey(), 'username'=>$this->string()->notNull()->unique()." COMMENT '用戶名'", 'auth_key'=>$this->string(32)->notNull()." COMMENT '認(rèn)證Key'", 'password_hash'=>$this->string()->notNull()." COMMENT '暗碼'", 'password_reset_token'=>$this->string()->unique()." COMMENT '暗碼重置Token'", 'email'=>$this->string()->notNull()->unique()." COMMENT '郵箱'", 'status'=>$this->smallInteger()->notNull()->defaultValue(10)." COMMENT '狀態(tài)'", 'created_at' => $this->integer()->notNull()." COMMENT '創(chuàng)建時間'", 'updated_at' => $this->integer()->notNull()." COMMENT '更新時間'", ],$tableOptions); } public function down() { $this->dropTable(self::TBL_NAME); } }
繼續(xù)運(yùn)行下述命令行代碼,即可生成admin表,由于只是做演示,所以admin和user表基本一樣,不要在意這些細(xì)節(jié).
PHP學(xué)習(xí)
yii migratePHP學(xué)習(xí)
好了,生成兩個表后,我們就必要將前臺登錄和后臺登陸徹底分開了:
PHP學(xué)習(xí)
1、前臺修改:由于已經(jīng)不公用了,所以先把公用的common/models中的User.php和LoginForm.php移動到frontend/models中去,順便將這兩個文件的命名空間改為以frontend開頭,將整個前臺文件看一遍,把所有涉及到這兩個common文件命名空間的需要都改為前臺本身的命名空間.
PHP學(xué)習(xí)
2、后臺修改:同樣需要在backend/models中有這兩個文件Admin.php和LoginForm.php,可以使用Gii生成(需要注意要繼承IdentityInterface,實(shí)現(xiàn)此接口內(nèi)的辦法以及參照User.php來實(shí)現(xiàn)相關(guān)登錄注冊辦法),也可以直接復(fù)制同樣上面的兩個文件(需要將User.php改名為Admin.php,且注意user表和admin表字段名稱或個數(shù)是否一致,不一致則需要在Admin.php中修改).由于我們原先創(chuàng)建過后臺的GRUD,所以這里改動挺多的(searchModel,controller,view都需要改成admin的),建議對照著Gii生成的文件預(yù)覽來改.哎,如果實(shí)際要前后臺分離,本章應(yīng)該放在第五章節(jié)的前面,那后臺就不需要改這么多了.
PHP學(xué)習(xí)
現(xiàn)在可以登錄前后臺試試,等等,我們后臺表雖然創(chuàng)建好了,但是還沒有添加管理員,現(xiàn)在由于后臺已經(jīng)登陸不進(jìn)去了,所以在后臺內(nèi)也無法創(chuàng)建了,并且注冊功能也沒有(這種分離下,后臺一般沒需要有注冊功能),所以這里繼續(xù)用console的功能來創(chuàng)建一個用戶,控制臺的功能挺多的,不僅僅是數(shù)據(jù)庫管理,可以點(diǎn)這里了解下.
PHP學(xué)習(xí)
在console/controllers中新建InitController,然后如下代碼:
PHP學(xué)習(xí)
<?php /** * Application initialization * 參照深入理解Yii2.0視頻教程 */ namespace console\controllers; use backend\models\Admin; class InitController extends \yii\console\Controller { /** * Create init admin */ public function actionAdmin() { echo "Create init admin ...\n"; // 提示當(dāng)前操作 $username = $this->prompt('Admin Name:'); // 接收用戶名 $email = $this->prompt('Email:'); // 接收Email $password = $this->prompt('Password:'); // 接收暗碼 $model = new Admin(); // 創(chuàng)建一個新用戶 $model->username = $username; // 完成賦值 $model->email = $email; $model->password = $password;//注意這個地方,用了Admin模型中的setPassword方法(魔術(shù)方法__set) if (!$model->save()) // 保存新的用戶 { foreach ($model->getErrors() as $error) // 如果保存失敗,說明有錯誤,那就輸出錯誤信息. { foreach ($error as $e) { echo "$e\n"; } } return 1; // 命令行返回1表示有異常 } return 0; // 返回0表示一切OK } }
InitController.phpPHP學(xué)習(xí)
然后再命令行中運(yùn)行:
PHP學(xué)習(xí)
yii init/adminPHP學(xué)習(xí)
依照提示來填寫用戶名密碼等,便可以產(chǎn)生一條數(shù)據(jù)了,當(dāng)我們查看這條記錄時,發(fā)現(xiàn)我們填寫的明文密碼變成加密的了,而創(chuàng)建時間和更新和更新時間我們沒填寫也自動給填寫了,前者是由于用了__set魔術(shù)方法,后者是用了“行為”,如果不是很理解請看《深入理解Yii2.0》,里面講的比較詳細(xì).還有就是,可能在window下cmd運(yùn)行中文亂碼,大體搜了下沒找到好的解決方法,不過可以試下Cygwin這個windows下可以運(yùn)行l(wèi)inux命令的軟件,挺好用的,設(shè)置成utf-8就不會亂碼了,而且可以用gcc什么的.
PHP學(xué)習(xí)
3、現(xiàn)在我們前后臺都能依照自己數(shù)據(jù)庫里的數(shù)據(jù)來登錄了,但是由于session等公用一個,所以還是退出時,前后臺一起退出,需要進(jìn)一步操作:可以參照這篇wiki.
PHP學(xué)習(xí)
后臺,在backend/config/main.php或者main-local.php中
PHP學(xué)習(xí)
'components' => [ 'user' => [ 'identityClass' => 'backend\models\Admin', 'enableAutoLogin' => true, 'identityCookie' => [ 'name' => '_backendUser', // unique for backend ], ], 'session' => [ 'name' => 'PHPBACKSESSID', 'savePath' => sys_get_temp_dir(), ], 'request' => [ 'cookieValidationKey' => 'orGkZNZvZe3-4WicYHyGMS-EyI6Tp8yi',//random string 'csrfParam' => '_backendCSRF', ],
同樣在前臺,在frontend/config/main.php或者main-local.php中
PHP學(xué)習(xí)
'components' => [ 'user' => [ 'identityClass' => 'frontend\models\User', 'enableAutoLogin' => true, 'identityCookie' => [ 'name' => '_frontendUser', // unique for frontend ] ], 'session' => [ 'name' => 'PHPFRONTSESSID', 'savePath' => sys_get_temp_dir(), ], 'request' => [ 'cookieValidationKey' => '8rqO22WJ9yiAx_KuJ8SFnbKctqGDWi9J', 'csrfParam' => '_frontendCSRF', ],
這樣再登陸試下,就會發(fā)現(xiàn)前后臺完全沒關(guān)聯(lián)了.可以調(diào)用Yii::$app的功能,例如Yii::$app->user->id,如果是在后臺的目錄中,會顯示后臺的用戶id,如果是在前臺的目錄中則會顯示前臺的用戶id.可能有些強(qiáng)迫癥患者想同Yii1那樣用Yii::$app->admin->id來拜訪后臺用戶id,這個不太好實(shí)現(xiàn),Yii2和Yii1相比,用戶驗(yàn)證這塊改動挺大的,web/User在Yii2框架中作為核心組件,如果要修改的話應(yīng)該還要關(guān)聯(lián)修改web/Application中的變量方法等,個人感覺沒必要.
PHP學(xué)習(xí)
以上,便是所說的,其實(shí)還有很多已經(jīng)集成好的yii2-user、帶權(quán)限控制等的插件可以直接從composer中搜索使用.例如點(diǎn)擊率最高的這個,可以配置B類型的驗(yàn)證,而且集成了更多功能.
PHP學(xué)習(xí)
《PHP編程:Yii2前后臺分離及migrate使用(七)》是否對您有啟發(fā),歡迎查看更多與《PHP編程:Yii2前后臺分離及migrate使用(七)》相關(guān)教程,學(xué)精學(xué)透。維易PHP學(xué)院為您提供精彩教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/6796.html