亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

Yii2前后臺分離及migrate使用(七)

2020-03-22 20:00:13
字體:
來源:轉載
供稿:網友
最近一直忙其它的(其實是懶!),將《深入理解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
生成:
use yii/db/Migration;html' target='_blank'>class m160501_053640_add_column_to_admin extends Migrationpublic 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:
* 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 Migrationconst 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:
use yii/db/Migration;class m160427_133556_create_admin extends Migrationconst 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 '認證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 '狀態'",'created_at' = $this- integer()- notNull()." COMMENT '創建時間'",'updated_at' = $this- integer()- notNull()." COMMENT '更新時間'",],$tableOptions);public function down()$this- dropTable(self::TBL_NAME);}繼續運行下述命令行代碼,即可生成admin表,由于只是做演示,所以admin和user表基本一樣,不要在意這些細節。
yii migrate好了,生成兩個表后,我們就需要將前臺登錄和后臺登陸徹底分開了:
1、前臺修改:由于已經不公用了,所以先把公用的common/models中的User.php和LoginForm.php移動到frontend/models中去,順便將這兩個文件的命名空間改為以frontend開頭,將整個前臺文件看一遍,把所有涉及到這兩個common文件命名空間的需要都改為前臺自己的命名空間。
2、后臺修改:同樣需要在backend/models中有這兩個文件Admin.php和LoginForm.php,可以使用Gii生成(需要注意要繼承IdentityInterface,實現此接口內的方法以及參照User.php來實現相關登錄注冊方法),也可以直接復制同樣上面的兩個文件(需要將User.php改名為Admin.php,且注意user表和admin表字段名稱或個數是否一致,不一致則需要在Admin.php中修改)。由于我們原先創建過后臺的GRUD,所以這里改動挺多的(searchModel,controller,view都需要改成admin的),建議對照著Gii生成的文件預覽來改。哎,如果實際要前后臺分離,本章應該放在第五章節的前面,那后臺就不需要改這么多了。
現在可以登錄前后臺試試,等等,我們后臺表雖然創建好了,但是還沒有添加管理員,現在由于后臺已經登陸不進去了,所以在后臺內也無法創建了,并且注冊功能也沒有(這種分離下,后臺一般沒必要有注冊功能),所以這里繼續用console的功能來創建一個用戶,控制臺的功能挺多的,不僅僅是數據庫管理,可以點這里了解下。
在console/controllers中新建InitController,然后如下代碼:
* Application initialization* 參照深入理解Yii2.0視頻教程namespace console/controllers;use backend/models/Admin;class InitController extends /yii/console/Controller* Create init adminpublic function actionAdmin()echo "Create init admin .../n"; // 提示當前操作$username = $this- prompt('Admin Name:'); // 接收用戶名$email = $this- prompt('Email:'); // 接收Email$password = $this- prompt('Password:'); // 接收密碼$model = new Admin(); // 創建一個新用戶$model- username = $username; // 完成賦值$model- email = $email;$model- password = $password;//注意這個地方,用了Admin模型中的setPassword方法(魔術方法__set)if (!$model- save()) // 保存新的用戶foreach ($model- getErrors() as $error) // 如果保存失敗,說明有錯誤,那就輸出錯誤信息。foreach ($error as $e)echo "$e/n";return 1; // 命令行返回1表示有異常return 0; // 返回0表示一切OK}InitController.php然后再命令行中運行:
yii init/admin按照提示來填寫用戶名密碼等,便可以產生一條數據了,當我們查看這條記錄時,發現我們填寫的明文密碼變成加密的了,而創建時間和更新和更新時間我們沒填寫也自動給填寫了,前者是由于用了__set魔術方法,后者是用了“行為”,如果不是很理解請看《深入理解Yii2.0》,里面講的比較詳細。還有就是,可能在window下cmd運行中文亂碼,大體搜了下沒找到好的解決方法,不過可以試下Cygwin這個windows下可以運行linux命令的軟件,挺好用的,設置成utf-8就不會亂碼了,而且可以用gcc什么的。
3、現在我們前后臺都能按照自己數據庫里的數據來登錄了,但是由于session等公用一個,所以還是退出時,前后臺一起退出,需要進一步操作:可以參照這篇wiki。
后臺,在backend/config/main.php或者main-local.php中
'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中
'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',],這樣再登陸試下,就會發現前后臺完全沒關聯了??梢哉{用Yii::$app的功能,例如Yii::$app- user- id,如果是在后臺的目錄中,會顯示后臺的用戶id,如果是在前臺的目錄中則會顯示前臺的用戶id??赡苡行娖劝Y患者想同Yii1那樣用Yii::$app- admin- id來訪問后臺用戶id,這個不太好實現,Yii2和Yii1相比,用戶驗證這塊改動挺大的,web/User在Yii2框架中作為核心組件,如果要修改的話應該還要關聯修改web/Application中的變量方法等,個人感覺沒必要。
以上,就是所說的,其實還有很多已經集成好的yii2-user、帶權限控制等的插件可以直接從composer中搜索使用。例如點擊率最高的這個,可以配置B類型的驗證,而且集成了更多功能。
PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人免费观看49www在线观看| 欧美寡妇偷汉性猛交| 亚洲成人黄色网| 亚洲色图日韩av| 国产精品jizz在线观看麻豆| 国产精品天天狠天天看| 亚洲va欧美va国产综合久久| 91精品国产九九九久久久亚洲| 国产性猛交xxxx免费看久久| 国产精品色视频| 亚洲激情在线观看视频免费| 92裸体在线视频网站| 国产精品视频白浆免费视频| 国产亚洲欧洲黄色| 国产在线观看91精品一区| 亚洲国产一区二区三区在线观看| 日韩免费在线视频| 精品国产乱码久久久久久天美| 欧美在线视频在线播放完整版免费观看| 欧美激情a在线| 精品人伦一区二区三区蜜桃免费| 国产香蕉一区二区三区在线视频| 久久av红桃一区二区小说| 91夜夜未满十八勿入爽爽影院| 啊v视频在线一区二区三区| 欧美亚洲另类视频| 亚洲国产一区二区三区四区| 日韩av免费观影| 亚洲mm色国产网站| 亚洲人成电影网站色| 欧美精品电影免费在线观看| 欧美激情精品久久久久久大尺度| 在线精品高清中文字幕| 高清亚洲成在人网站天堂| 中文字幕不卡在线视频极品| 日韩欧美国产中文字幕| 国产精品一区二区三区免费视频| 久久躁日日躁aaaaxxxx| 日本午夜在线亚洲.国产| 亚洲人高潮女人毛茸茸| 91国产一区在线| 亚洲精品456在线播放狼人| 91地址最新发布| 欧美成人精品三级在线观看| 欧美国产激情18| 亚洲日韩中文字幕在线播放| 在线激情影院一区| 色诱女教师一区二区三区| 日韩久久精品成人| 成人免费视频a| 久久精品成人一区二区三区| 国产精品久久久久久久久久久久久久| 日本久久精品视频| 国产精品中文久久久久久久| 亚洲图片欧美午夜| 亚洲国产精品va在线看黑人| 欧美美最猛性xxxxxx| 成人久久精品视频| 国产亚洲美女精品久久久| 日韩av电影免费观看高清| 国产欧美日韩精品丝袜高跟鞋| 深夜福利一区二区| 国产精品久久97| 亚洲人成网7777777国产| 蜜臀久久99精品久久久无需会员| 国产一区二区三区三区在线观看| 国产视频精品va久久久久久| 91丨九色丨国产在线| 久久久久在线观看| 自拍偷拍亚洲一区| 国产精品久久久久久一区二区| 国产精品嫩草影院一区二区| 992tv成人免费视频| 91香蕉嫩草神马影院在线观看| 亚洲最大福利网站| 日本成人黄色片| 日韩a**站在线观看| 一区二区三区国产视频| 久久精品最新地址| 亚洲综合自拍一区| 欧美亚洲成人免费| 亚洲国产一区二区三区在线观看| www.色综合| 亚洲成av人乱码色午夜| 欧美人与性动交a欧美精品| 日本中文字幕久久看| 欧美猛少妇色xxxxx| 日韩av男人的天堂| 国产成人在线精品| 欧美日本亚洲视频| 久久久免费观看| 俺去了亚洲欧美日韩| 亚洲女人天堂成人av在线| 亚洲国产精品久久久| 成人a视频在线观看| 人妖精品videosex性欧美| 国语自产在线不卡| 欧美日韩成人在线播放| 伊人一区二区三区久久精品| 高清亚洲成在人网站天堂| 91久久久久久国产精品| 最近的2019中文字幕免费一页| 亚洲精品一区av在线播放| 狠狠色噜噜狠狠狠狠97| 91精品国产综合久久男男| 久久亚洲一区二区三区四区五区高| 91久久国产综合久久91精品网站| 少妇高潮 亚洲精品| 亚洲精品欧美日韩专区| 欧美另类暴力丝袜| 欧美一级大片在线观看| 色综合色综合网色综合| 91在线播放国产| 欧美日韩激情网| 亚洲激情自拍图| 日韩av成人在线| 国产精品久久久久999| 欧美午夜精品伦理| 久久精品青青大伊人av| 亚洲视频在线观看视频| 国产精品视频色| 亚洲日本中文字幕免费在线不卡| 亚洲天天在线日亚洲洲精| 国语自产精品视频在免费| 狠狠久久亚洲欧美专区| 精品亚洲永久免费精品| 日韩欧美一区二区在线| 欧美激情久久久久| 性色av一区二区三区在线观看| 亚洲欧洲xxxx| 亚洲精品小视频在线观看| 日韩欧美在线字幕| 一本大道久久加勒比香蕉| 中文字幕av一区二区| 97在线视频国产| 日韩精品欧美国产精品忘忧草| 欧美资源在线观看| 精品福利免费观看| 欧美在线视频一区二区| 久久久噜噜噜久久中文字免| 成人写真福利网| 色噜噜国产精品视频一区二区| 色一区av在线| 在线精品国产欧美| 最近2019中文免费高清视频观看www99| 91精品视频在线看| 国模精品视频一区二区三区| 成人av电影天堂| 欧美日韩一区二区在线播放| 精品少妇一区二区30p| 亚洲视频在线观看免费| 国产91在线播放精品91| 久久久久一本一区二区青青蜜月| 中文字幕在线看视频国产欧美在线看完整| 久久久免费电影| 精品国产拍在线观看| 日韩人体视频一二区| 91高清视频在线免费观看| 国产精品丝袜高跟| 国产精品午夜一区二区欲梦| 亚洲精品欧美极品| 在线观看国产精品日韩av| 最近2019中文字幕大全第二页| 久久久久久久久久久亚洲|