最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2016年05月04日 10:32:26   作者:漫游云巔  
這篇文章主要介紹了Yii2前后臺(tái)分離及migrate使用的相關(guān)資料,需要的朋友可以參考下

最近一直忙其它的(其實(shí)是懶!),將《深入理解Yii2》看了一遍,一些當(dāng)初沒(méi)明白的稍微明了了點(diǎn),然后又看yii2的圖片上傳等處理、富文本、restful什么的,但由于沒(méi)進(jìn)行到這里,只看也不管用啊,所以還是按照步驟一步步來(lái),先說(shuō)說(shuō)前后臺(tái)分離。(其實(shí)普通的內(nèi)容管理站點(diǎn)用不著下面所說(shuō)的徹底分離什么的,看看也無(wú)妨)

個(gè)人感覺(jué)前后臺(tái)的情況有這么幾種,首先是前后臺(tái)是否是用一個(gè)驗(yàn)證體系,其次是前后臺(tái)是否共用一個(gè)數(shù)據(jù)表。

一般來(lái)說(shuō)下面三種比較常用吧:

A、共用一個(gè)驗(yàn)證體系和一個(gè)數(shù)據(jù)表。

B、兩個(gè)驗(yàn)證體系和共用一個(gè)數(shù)據(jù)表。

C、兩個(gè)驗(yàn)證體系和兩個(gè)數(shù)據(jù)表。

Yii2高級(jí)版里面默認(rèn)是A類(lèi)型,即數(shù)據(jù)表一樣,且一邊登錄/登出了,另一邊也同樣登錄/登出,感覺(jué)這種結(jié)構(gòu)比較適用于論壇這種,管理員也需要有與會(huì)員一樣發(fā)帖回帖等功能,表字段也基本一致,(個(gè)人這樣認(rèn)為,畢竟接觸的不多,網(wǎng)上也搜過(guò)不同的后臺(tái)構(gòu)建的話(huà)題,但是很少有詳細(xì)討論的),這種可以通過(guò)字段、權(quán)限等來(lái)區(qū)分前后臺(tái)。而我們將要做的是C類(lèi)型,像是一些電商網(wǎng)站,后臺(tái)的管理員和前臺(tái)的會(huì)員功能就相差太大了,且表字段差別也大,所以驗(yàn)證體系不一樣,而且放兩個(gè)數(shù)據(jù)表比較好。至于B類(lèi)型算是C類(lèi)型的簡(jiǎn)化版,C如果會(huì)設(shè)置的話(huà),B也同理。

那我們先建立一個(gè)admin表,用來(lái)存放管理員數(shù)據(jù),而會(huì)員仍然用原有的user表,這里用yii的migrate來(lái)創(chuàng)建,在Yii2初始化章節(jié)中有提到過(guò),這里稍微詳細(xì)說(shuō)下:

1、yii2版本2.07以前用命令,即可在console/migrations目錄下創(chuàng)建一個(gè)php文件,然后在此文件下編寫(xiě)創(chuàng)建表語(yǔ)句等等就可以了。

yii migrate/create admin

2、yii2版本2.07后,增加了更細(xì)致的分類(lèi),例如我已經(jīng)創(chuàng)建了admin表,但少了一個(gè)status字段,那我可以直接用下面命令便會(huì)生成只增加字段的文件

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');
}
}

具體為什么會(huì)這樣,我們看下原代碼,在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來(lái)確定具體是指向哪個(gè)模板,從而生成不同的樣式。

根據(jù)migrate/create后面的參數(shù)總共匹配這幾種樣式:

1、create_junction_表名_and_表名,用來(lái)創(chuàng)建聯(lián)結(jié)表

2、add_xxx_to_表名,用來(lái)增加字段(可以用--fields樣式指定一個(gè)字段,否則生成空的,需要自己寫(xiě),當(dāng)然也可以改模板添加個(gè)注釋示例)

3、drop_xxx_from_表名,用來(lái)刪除字段(同上)

4、create_表名,用來(lái)創(chuàng)建表

5、drop_表名,用來(lái)刪除表

注:可以直接在控制臺(tái)用yii help migrate來(lái)查看更多的用法

模板文件可以在vendor/yiisoft/yii2/views中找到對(duì)應(yīng)的,如果想更改模板,讓其更適合自己的操作,可以這樣:

在console文件中新建views文件夾,將上方的你想修改的模板復(fù)制到這里來(lái)修改,然后再console/config/main.php中修改

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個(gè)都寫(xiě)全了,如果不修改,則寫(xiě)原來(lái)的路徑,原來(lái)的路徑可在vendor/yiisoft/yii2/console/MigrateController.php中查看,否則你用到?jīng)]寫(xiě)的那個(gè)命令模板的時(shí)候就會(huì)報(bào)錯(cuò)。

至于如何寫(xiě)具體的創(chuàng)建表、添加字段等語(yǔ)句,其實(shí)也有版本不同(2.06新寫(xiě)法)的兩種寫(xiě)法,這里就不要看中文版的沒(méi)有更新的yii2指南了,直接看英文更新的,點(diǎn)這里,里面包含上面說(shuō)的內(nèi)容加具體的寫(xiě)法。當(dāng)初費(fèi)了很多時(shí)間google搜索、順著源碼看才搞明白上面說(shuō)的原理,后來(lái)一看,在人家英文版里都寫(xiě)了,悲劇,而且最近我在Yii英文官網(wǎng)api文檔搜索任何關(guān)鍵字都不出現(xiàn)結(jié)果了,不知道是這邊的問(wèn)題還是官網(wǎng)問(wèn)題,只能對(duì)照著中文指南和英文指南看到底是對(duì)應(yīng)的哪一塊。所以說(shuō)如果英語(yǔ)更好點(diǎn)就好了,直接看英文文檔。

目前自己修改了create_table時(shí)加表注釋、段注釋?zhuān)ㄟ@個(gè)搜索及查源碼沒(méi)找到類(lèi)似->comment的寫(xiě)法,可能是為了兼容其它數(shù)據(jù)庫(kù),所以只能拼接,而寫(xiě)段注釋的好處是,gii 生成model時(shí)attributeLabels方法可以直接根據(jù)注釋來(lái)顯示對(duì)應(yīng)的中文名字),add_column和drop_column模板增加一個(gè)示例注釋?zhuān)奖阃擞梅〞r(shí)參照注釋的示例來(lái)寫(xiě),而且這樣就不用加--fileds參數(shù)了。呃,這里貼一下自己的模板和最終應(yīng)該建立的admin表的語(yǔ)句吧:

模板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="填寫(xiě)表注釋"';
}
$this->createTable(self::TBL_NAME, [
<?php foreach ($fields as $field): ?>
<?php if ($field == end($fields)): ?>
'<?= $field['property'] ?>' => $this-><?= $field['decorators'].".\" COMMENT '填寫(xiě)段注釋'\"" . "\n"?>
<?php else: ?>
'<?= $field['property'] ?>' => $this-><?= $field['decorators'].".\" COMMENT '填寫(xiě)段注釋'\"" . ",\n"?>
<?php endif; ?>
<?php endforeach; ?>
],$tableOptions);
}
public function down()
{
$this->dropTable(self::TBL_NAME);
}
}

具體語(yǔ)句m160326_133655_create_admin.php:

<?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="后臺(tái)管理員表"';
}
$this->createTable(self::TBL_NAME, [
'id' => $this->primaryKey(),
'username'=>$this->string()->notNull()->unique()." COMMENT '用戶(hù)名'",
'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)建時(shí)間'",
'updated_at' => $this->integer()->notNull()." COMMENT '更新時(shí)間'",
],$tableOptions);
}
public function down()
{
$this->dropTable(self::TBL_NAME);
}
}

繼續(xù)運(yùn)行下述命令行代碼,即可生成admin表,由于只是做演示,所以admin和user表基本一樣,不要在意這些細(xì)節(jié)。

yii migrate

好了,生成兩個(gè)表后,我們就需要將前臺(tái)登錄和后臺(tái)登陸徹底分開(kāi)了:

1、前臺(tái)修改:由于已經(jīng)不公用了,所以先把公用的common/models中的User.php和LoginForm.php移動(dòng)到frontend/models中去,順便將這兩個(gè)文件的命名空間改為以frontend開(kāi)頭,將整個(gè)前臺(tái)文件看一遍,把所有涉及到這兩個(gè)common文件命名空間的需要都改為前臺(tái)自己的命名空間。

2、后臺(tái)修改:同樣需要在backend/models中有這兩個(gè)文件Admin.php和LoginForm.php,可以使用Gii生成(需要注意要繼承IdentityInterface,實(shí)現(xiàn)此接口內(nèi)的方法以及參照User.php來(lái)實(shí)現(xiàn)相關(guān)登錄注冊(cè)方法),也可以直接復(fù)制同樣上面的兩個(gè)文件(需要將User.php改名為Admin.php,且注意user表和admin表字段名稱(chēng)或個(gè)數(shù)是否一致,不一致則需要在A(yíng)dmin.php中修改)。由于我們?cè)葎?chuàng)建過(guò)后臺(tái)的GRUD,所以這里改動(dòng)挺多的(searchModel,controller,view都需要改成admin的),建議對(duì)照著Gii生成的文件預(yù)覽來(lái)改。哎,如果實(shí)際要前后臺(tái)分離,本章應(yīng)該放在第五章節(jié)的前面,那后臺(tái)就不需要改這么多了。

現(xiàn)在可以登錄前后臺(tái)試試,等等,我們后臺(tái)表雖然創(chuàng)建好了,但是還沒(méi)有添加管理員,現(xiàn)在由于后臺(tái)已經(jīng)登陸不進(jìn)去了,所以在后臺(tái)內(nèi)也無(wú)法創(chuàng)建了,并且注冊(cè)功能也沒(méi)有(這種分離下,后臺(tái)一般沒(méi)必要有注冊(cè)功能),所以這里繼續(xù)用console的功能來(lái)創(chuàng)建一個(gè)用戶(hù),控制臺(tái)的功能挺多的,不僅僅是數(shù)據(jù)庫(kù)管理,可以點(diǎn)這里了解下。

在console/controllers中新建InitController,然后如下代碼:

<?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:'); // 接收用戶(hù)名
$email = $this->prompt('Email:'); // 接收Email
$password = $this->prompt('Password:'); // 接收密碼
$model = new Admin(); // 創(chuàng)建一個(gè)新用戶(hù)
$model->username = $username; // 完成賦值
$model->email = $email;
$model->password = $password;//注意這個(gè)地方,用了Admin模型中的setPassword方法(魔術(shù)方法__set)
if (!$model->save()) // 保存新的用戶(hù)
{
foreach ($model->getErrors() as $error) // 如果保存失敗,說(shuō)明有錯(cuò)誤,那就輸出錯(cuò)誤信息。
{
foreach ($error as $e)
{
echo "$e\n";
}
}
return 1; // 命令行返回1表示有異常
}
return 0; // 返回0表示一切OK
}
}

InitController.php

然后再命令行中運(yùn)行:

yii init/admin

按照提示來(lái)填寫(xiě)用戶(hù)名密碼等,便可以產(chǎn)生一條數(shù)據(jù)了,當(dāng)我們查看這條記錄時(shí),發(fā)現(xiàn)我們填寫(xiě)的明文密碼變成加密的了,而創(chuàng)建時(shí)間和更新和更新時(shí)間我們沒(méi)填寫(xiě)也自動(dòng)給填寫(xiě)了,前者是由于用了__set魔術(shù)方法,后者是用了“行為”,如果不是很理解請(qǐng)看《深入理解Yii2.0》,里面講的比較詳細(xì)。還有就是,可能在window下cmd運(yùn)行中文亂碼,大體搜了下沒(méi)找到好的解決方法,不過(guò)可以試下Cygwin這個(gè)windows下可以運(yùn)行l(wèi)inux命令的軟件,挺好用的,設(shè)置成utf-8就不會(huì)亂碼了,而且可以用gcc什么的。

3、現(xiàn)在我們前后臺(tái)都能按照自己數(shù)據(jù)庫(kù)里的數(shù)據(jù)來(lái)登錄了,但是由于session等公用一個(gè),所以還是退出時(shí),前后臺(tái)一起退出,需要進(jìn)一步操作:可以參照這篇wiki。

后臺(tái),在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',
],

同樣在前臺(tái),在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',
],

這樣再登陸試下,就會(huì)發(fā)現(xiàn)前后臺(tái)完全沒(méi)關(guān)聯(lián)了??梢哉{(diào)用Yii::$app的功能,例如Yii::$app->user->id,如果是在后臺(tái)的目錄中,會(huì)顯示后臺(tái)的用戶(hù)id,如果是在前臺(tái)的目錄中則會(huì)顯示前臺(tái)的用戶(hù)id??赡苡行?qiáng)迫癥患者想同Yii1那樣用Yii::$app->admin->id來(lái)訪(fǎng)問(wèn)后臺(tái)用戶(hù)id,這個(gè)不太好實(shí)現(xiàn),Yii2和Yii1相比,用戶(hù)驗(yàn)證這塊改動(dòng)挺大的,web/User在Yii2框架中作為核心組件,如果要修改的話(huà)應(yīng)該還要關(guān)聯(lián)修改web/Application中的變量方法等,個(gè)人感覺(jué)沒(méi)必要。

以上,就是所說(shuō)的,其實(shí)還有很多已經(jīng)集成好的yii2-user、帶權(quán)限控制等的插件可以直接從composer中搜索使用。例如點(diǎn)擊率最高的這個(gè),可以配置B類(lèi)型的驗(yàn)證,而且集成了更多功能。

相關(guān)文章

  • laravel 框架執(zhí)行流程與原理簡(jiǎn)單分析

    laravel 框架執(zhí)行流程與原理簡(jiǎn)單分析

    這篇文章主要介紹了laravel 框架執(zhí)行流程與原理,結(jié)合實(shí)例形式分析了laravel框架基本執(zhí)行流程、原理及相關(guān)操作技巧,需要的朋友可以參考下
    2020-02-02
  • Thinkphp自定義生成縮略圖尺寸的方法

    Thinkphp自定義生成縮略圖尺寸的方法

    這篇文章主要介紹了Thinkphp自定義生成縮略圖尺寸的方法 ,本文給大家介紹的非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 使用phpstorm和xdebug實(shí)現(xiàn)遠(yuǎn)程調(diào)試的方法

    使用phpstorm和xdebug實(shí)現(xiàn)遠(yuǎn)程調(diào)試的方法

    vs的斷點(diǎn)調(diào)試功能很強(qiáng)大有木有,能查看所有變量有木有。php調(diào)試很麻煩有木有,echo,var_dump寫(xiě)得你想吐了有木有。想體驗(yàn)一下ide調(diào)試的快感嗎?那就來(lái)使用xdebug吧
    2015-12-12
  • Laravel中unique和exists驗(yàn)證規(guī)則的優(yōu)化詳解

    Laravel中unique和exists驗(yàn)證規(guī)則的優(yōu)化詳解

    這篇文章主要給大家介紹了關(guān)于Laravel中unique和exists驗(yàn)證規(guī)則的優(yōu)化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • Yii框架ACF(accessController)簡(jiǎn)單權(quán)限控制操作示例

    Yii框架ACF(accessController)簡(jiǎn)單權(quán)限控制操作示例

    這篇文章主要介紹了Yii框架ACF(accessController)簡(jiǎn)單權(quán)限控制操作,結(jié)合實(shí)例形式分析了Yii框架簡(jiǎn)單權(quán)限控制操作參數(shù)設(shè)置與使用技巧,需要的朋友可以參考下
    2019-04-04
  • 19個(gè)超實(shí)用的PHP代碼片段

    19個(gè)超實(shí)用的PHP代碼片段

    每位程序員和開(kāi)發(fā)者都喜歡討論他們最?lèi)?ài)的代碼片段,尤其是當(dāng)PHP開(kāi)發(fā)者花費(fèi)數(shù)個(gè)小時(shí)為網(wǎng)頁(yè)編碼或創(chuàng)建應(yīng)用時(shí),他們更知道這些代碼的重要性。為了節(jié)約編碼時(shí)間,小編收集了一些較為實(shí)用的代碼片段,幫助開(kāi)發(fā)者提高工作效率
    2014-03-03
  • thinkphp5使用無(wú)限極分類(lèi)

    thinkphp5使用無(wú)限極分類(lèi)

    這篇文章主要為大家詳細(xì)介紹了thinkphp5使用無(wú)限極分類(lèi),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • ThinkPHP中的關(guān)聯(lián)模型注意點(diǎn)

    ThinkPHP中的關(guān)聯(lián)模型注意點(diǎn)

    這篇文章主要介紹了初學(xué)ThinkPHP中的關(guān)聯(lián)模型注意點(diǎn),需要的朋友可以參考下
    2014-06-06
  • php文件擴(kuò)展名判斷及獲取文件擴(kuò)展名的N種方法

    php文件擴(kuò)展名判斷及獲取文件擴(kuò)展名的N種方法

    本篇文章主要通過(guò)代碼給大家介紹php文件擴(kuò)展名判斷以及獲取文件擴(kuò)展名的N種方法,需要的朋友跟著腳本之家小編一起學(xué)習(xí)學(xué)習(xí)吧
    2015-09-09
  • 可以在線(xiàn)執(zhí)行PHP代碼包裝修正版

    可以在線(xiàn)執(zhí)行PHP代碼包裝修正版

    在寒竹、Fanbin等等熱心的朋友的幫助下,這款小巧的程序終于誕生了。 想做這款程序的初衷是方便測(cè)試一些代碼,這樣就不用新建文件->輸入代碼->保存->打開(kāi)瀏覽器->定位到php文件->查看瀏覽結(jié)果這么一個(gè)繁瑣的過(guò)程了,現(xiàn)在只要把地址保存到收藏夾,然后要測(cè)試的時(shí)候,拿出來(lái),直接輸入代碼測(cè)試就行了。 代碼輸入也挺方便的,自動(dòng)高亮、自動(dòng)完成,當(dāng)然不支持代碼提示
    2008-03-03

最新評(píng)論

罗山县| 宁武县| 平顺县| 伊金霍洛旗| 惠安县| 黄浦区| 特克斯县| 武川县| 临潭县| 五华县| 通山县| 高安市| 龙南县| 白水县| 榆树市| 房产| 嘉禾县| 香港| 旬阳县| 浮梁县| 斗六市| 新民市| 吉安市| 沂南县| 即墨市| 三穗县| 宁蒗| 大化| 阿拉善左旗| 桦南县| 金溪县| 淮北市| 新田县| 黑山县| 高雄市| 南宫市| 简阳市| 延长县| 武城县| 徐州市| 江川县|