検索
ホームページバックエンド開発PHPチュートリアルYii2 フロントエンドとバックエンドの分離と移行の使用 (7)、yii2maigrate_PHP チュートリアル

Yii2 フロントエンドとバックエンドの分離と mit の使い方 (7), yii2mite

最近他の事で忙しくて (実は怠け者です!)、「Yii2 徹底理解」を読みました。最初に理解できなかったことが少しわかってきたので、yii2の画像アップロードやその他の処理、リッチテキスト、Restfulなども見てみましたが、ここまでたどり着かなかったので、見るだけででは機能しないので、ステップごとに説明し、最初にフロントエンドとバックエンドの分離について説明します。 (実際には、通常のコンテンツ管理サイトでは、以下に示す完全な分離は必要ありません。見ておいて損はありません)

個人的には、フロントエンドとバックエンドにはいくつかの状況があると感じています。1つ目は、フロントエンドとバックエンドが検証システムを使用しているかどうかです。データテーブルを共有します。

一般的には、次の 3 つがよく使用されます:

A. 検証システムとデータテーブルを共有します。

B. 2 つの検証システムが 1 つのデータ テーブルを共有します。

C、2 つの検証システムと 2 つのデータ テーブル。

Yii2 Advanced Edition のデフォルトバージョンはタイプ A、つまりデータテーブルが同じで、一方がログイン/ログアウトし、もう一方もログイン/ログアウトするこの構造の方が適していると感じます。投稿や返信などの機能は同じで、テーブルのフィールドも基本的に同じです(個人的にはそう思っていますが、結局のところ、私にはあまりありません)。私もインターネットでさまざまなバックエンド構築に関するトピックを検索しましたが、詳細な議論はほとんどありません。これは、フィールドと権限を通じて行うことができます。私たちがやろうとしているのは、一部の電子商取引 Web サイトなどのタイプ C です。バックエンド管理者とフロントエンドのメンバーシップ機能は大きく異なり、テーブルのフィールドも大きく異なるため、検証システムも異なります。データテーブルが 2 つあるとよいでしょう。タイプBはタイプCの簡易版です。Cが設定できればBも同様です。

次に、最初に管理者データを保存するための管理テーブルを作成しますが、メンバーは引き続き元のユーザー テーブルを使用して作成します。これについては、Yii2 の初期化の章で説明しました。

1. yii2 バージョン 2.07 より前では、コマンドを使用して console/migrations ディレクトリに php ファイルを作成し、このファイルの下に create table ステートメントを記述することができます。

yii 管理者の移行/作成

2. yii2 バージョン 2.07 以降、より詳細な分類が追加されました。たとえば、admin テーブルを作成しましたが、ステータス フィールドがありません。その後、次のコマンドを使用してフィールドのみを追加したファイルを生成できます。

yii add_column_to_admin を移行/作成 --fields=status:int(10):nontNull


生成:


リーリー

具体的になぜこれが当てはまるのか、vendor/yiisoft/yii2/console/BaseMigrateController.php ファイルの actionCreate メソッドにある元のコードを見てみましょう:

リーリー

ここでは、どのテンプレートを指しているかを決定するための通常の一致 add_xxx_to_xxx があり、それによってさまざまなスタイルが生成されていることがわかります。

移行/作成の背後にあるパラメータに従って、これらのスタイルは合計で一致します:

1. create_junction_table_name_and_table_name、ジャンクション テーブルの作成に使用されます


2. add_xxx_to_table 名はフィールドを追加するために使用されます (--fields スタイルを使用してフィールドを指定できます。それ以外の場合は空になるため、自分で記述する必要があります。もちろん、テンプレートを変更してコメントを追加することもできます)例)


3.drop_xxx_from_table 名、フィールドを削除するために使用されます (上記と同じ)


4. テーブルの作成に使用される create_table 名


5. テーブルを削除するために使用されるdrop_table名


注: yii help maigration をコンソールで直接使用して、さらに多くの使用状況を表示できます

対応するテンプレート ファイルは、vendor/yiisoft/yii2/views にあります。テンプレートを変更して独自の操作に適したものにするには、次のようにします。


コンソールファイルに新しいビューフォルダーを作成し、上で変更したいテンプレートをコピーしてここで変更し、console/config/main.phpで変更します

リーリー
generatorTemplateFiles 設定では、これら 5 つをすべて記述する必要があることに注意してください。変更しない場合は、元のパスを Vendor/yiisoft/yii2/console/MigrateController.php で参照できます。書き込まれていないコマンドテンプレートを使用するとエラーが報告されます。


テーブルの作成やフィールドの追加といった具体的なステートメントの書き方については、実はバージョンの違いで2通りの書き方があります(2.06の新しい書き方) まだ中国語版のyii2ガイドは見ないでください。更新されました。ここをクリックして更新された英語版をご覧ください。これには、上記の内容と具体的な書き方が含まれています。上記の原則を理解するために、Google で検索してソース コードを読むのに多くの時間を費やしましたが、後でそれがすべて英語版で書かれていることがわかりました。そして、最近、キーワードが見つかりませんでした。 Yii 英語公式 Web サイトの API ドキュメントの結果が表示されます。ここに問題があるのか​​、公式 Web サイトに問題があるのか​​はわかりません。中国語のガイドと英語のガイドを比較するしかありません。なので、英語の方が良かったらいいのですが、英語のドキュメントを見てください。

目前自己修改了create_table时加表注释、段注释(这个搜索及查源码没找到类似->comment的写法,可能是为了兼容其它数据库,所以只能拼接,而写段注释的好处是,gii 生成model时attributeLabels方法可以直接根据注释来显示对应的中文名字),add_column和drop_column模板增加一个示例注释,方便忘了用法时参照注释的示例来写,而且这样就不用加--fileds参数了。呃,这里贴一下自己的模板和最终应该建立的admin表的语句吧:

模板createTableMigration.php:

<&#63;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 "<&#63;php\n";
&#63;>
use yii\db\Migration;
class <&#63;= $className &#63;> extends Migration
{
const TBL_NAME = '{{%<&#63;=$table&#63;>}}';
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, [
<&#63;php foreach ($fields as $field): &#63;>
<&#63;php if ($field == end($fields)): &#63;>
'<&#63;= $field['property'] &#63;>' => $this-><&#63;= $field['decorators'].".\" COMMENT '填写段注释'\"" . "\n"&#63;>
<&#63;php else: &#63;>
'<&#63;= $field['property'] &#63;>' => $this-><&#63;= $field['decorators'].".\" COMMENT '填写段注释'\"" . ",\n"&#63;>
<&#63;php endif; &#63;>
<&#63;php endforeach; &#63;>
],$tableOptions);
}
public function down()
{
$this->dropTable(self::TBL_NAME);
}
}

具体语句m160326_133655_create_admin.php:

<&#63;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 '认证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,然后如下代码:

<&#63;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"; // 提示当前操作
$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。可能有些强迫症患者想同Yii1那样用Yii::$app->admin->id来访问后台用户id,这个不太好实现,Yii2和Yii1相比,用户验证这块改动挺大的,web/User在Yii2框架中作为核心组件,如果要修改的话应该还要关联修改web/Application中的变量方法等,个人感觉没必要。

以上,就是所说的,其实还有很多已经集成好的yii2-user、带权限控制等的插件可以直接从composer中搜索使用。例如点击率最高的这个,可以配置B类型的验证,而且集成了更多功能。

www.bkjia.com本当http://www.bkjia.com/PHPjc/1125232.html技術記事 Yii2 のフロントエンドとバックエンドの分離と mit の使用 (7)、最近 yii2mite は他のことで忙しくしていました (実は怠け者です!)、「Yii2 の徹底理解」を読んで、いくつか理解できなかった点がありました。最初の部分が少しわかりやすくなりました...
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
PHPセッションがすでに開始されているかどうかを確認するにはどうすればよいですか?PHPセッションがすでに開始されているかどうかを確認するにはどうすればよいですか?Apr 30, 2025 am 12:20 AM

PHPでは、session_status()またはsession_id()を使用して、セッションが開始されたかどうかを確認できます。 1)session_status()関数を使用します。 php_session_activeが返された場合、セッションが開始されました。 2)SESSION_ID()関数を使用します。空の文字列が返された場合、セッションが開始されます。どちらの方法でもセッション状態を効果的に確認でき、使用する方法を選択することは、PHPバージョンと個人的な好みに依存します。

Webアプリケーションでセッションを使用することが不可欠なシナリオを説明してください。Webアプリケーションでセッションを使用することが不可欠なシナリオを説明してください。Apr 30, 2025 am 12:16 AM

Sessionsionsionsarevitalinwebapplications、特にコマースプラットフォームの前。

PHPでの同時セッションアクセスをどのように管理できますか?PHPでの同時セッションアクセスをどのように管理できますか?Apr 30, 2025 am 12:11 AM

PHPでの同時セッションアクセスの管理は、次の方法で実行できます。1。データベースを使用してセッションデータを保存します。これらの方法は、データの一貫性を確保し、並行性のパフォーマンスを向上させるのに役立ちます。

PHPセッションを使用することの制限は何ですか?PHPセッションを使用することの制限は何ですか?Apr 30, 2025 am 12:04 AM

phpsessionshaveverallimitations:1)storagecconstraintscanleadtoperformanceissues; 2)securityvulnerablesliasitylikessessionfixationAttacksicexist;

負荷分散がセッション管理にどのように影響し、それに対処するかを説明します。負荷分散がセッション管理にどのように影響し、それに対処するかを説明します。Apr 29, 2025 am 12:42 AM

負荷分散はセッション管理に影響しますが、セッションの複製、セッションの粘着性、集中セッションストレージで解決できます。 1。セッションレプリケーションサーバー間のセッションデータをコピーします。 2。セッションスティンネスは、ユーザーリクエストを同じサーバーに指示します。 3.集中セッションストレージは、Redisなどの独立したサーバーを使用してセッションデータを保存してデータ共有を確保します。

セッションロックの概念を説明します。セッションロックの概念を説明します。Apr 29, 2025 am 12:39 AM

SESSIONLOCKINGISATECHNIQUESTOESUREAUSER'SSESSIONREMAINSEXCLUSIVETOONEUSATIME.ITISCRUCIALFORPREVENTINGDATACORTIONANDSECURITYBREACHESINMULTI-USERAPPLICATIONS.SESSIONLOCKINGISISIMPLEMENTEDUSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGROCKINGSMECHANISMなど

PHPセッションの選択肢はありますか?PHPセッションの選択肢はありますか?Apr 29, 2025 am 12:36 AM

PHPセッションの代替品には、Cookie、トークンベースの認証、データベースベースのセッション、Redis/Memcachedが含まれます。 1.Cookiesは、クライアントにデータを保存することによりセッションを管理します。 2.トークンベースの認証はトークンを使用してユーザーを検証します。これは非常に安全ですが、追加のロジックが必要です。 3.Databaseベースのセッションは、データベースにデータを保存します。これは、スケーラビリティが良好ですが、パフォーマンスに影響を与える可能性があります。 4. Redis/Memcachedは分散キャッシュを使用してパフォーマンスとスケーラビリティを向上させますが、追加のマッチングが必要です

PHPのコンテキストで「セッションハイジャック」という用語を定義します。PHPのコンテキストで「セッションハイジャック」という用語を定義します。Apr 29, 2025 am 12:33 AM

SessionHijackingとは、ユーザーのSessionIDを取得してユーザーになりすましている攻撃者を指します。予防方法には、次のものが含まれます。1)HTTPSを使用した通信の暗号化。 2)SessionIDのソースの検証。 3)安全なSessionID生成アルゴリズムの使用。 4)SessionIDを定期的に更新します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません