Yii-quick-guide
Yii-概要
*Yii [ji:]* フレームワークは、急速に開発されている最新のWebアプリケーション向けのオープンソースのPHPフレームワークです。 Model-View-Controller複合パターンを中心に構築されています。
Yiiは安全でプロフェッショナルな機能を提供し、堅牢なプロジェクトを迅速に作成します。 Yiiフレームワークには、コンポーネントベースのアーキテクチャと完全なソリッドキャッシングサポートがあります。 そのため、フォーラム、ポータル、コンテンツ管理システム、RESTfulサービス、eコマースWebサイトなど、あらゆる種類のWebアプリケーションの構築に適しています。 また、完全なCRUD(Create-Read-Update-Delete)インターフェースメーカーを含むGiiと呼ばれるコード生成ツールもあります。
コア機能
Yiiのコア機能は次のとおりです-
- YiiはMVCアーキテクチャパターンを実装します。
- リレーショナルデータベースとNoSQLデータベースの両方の機能を提供します。
- Yiiは、デザインパターンに従うという目的だけのために物事を過剰にデザインすることはありません。
- 非常に拡張可能です。
- Yiiは多層キャッシュのサポートを提供します。
- YiiはRESTful API開発サポートを提供します。
- 高性能です。
全体として、必要なのが基礎となるデータベースのきちんとしたインターフェイスだけである場合、Yiiが正しい選択です。 現在、Yiiには2つのバージョンがあります:1.1と2.0です。
バージョン1.1は現在メンテナンスモードであり、バージョン2はパッケージ配布用のComposerユーティリティ、PSRレベル1、2、4、および多くのPHP 5.4&plusなどの最新のテクノロジーを採用しています。特徴。 今後数年間で主な開発努力を受けるのはバージョン2です。
Yiiは純粋なOOP(オブジェクト指向プログラミング)フレームワークです。 したがって、OOPの基本的な知識が必要です。 Yiiフレームワークは、特性や名前空間などのPHPの最新機能も使用します。 これらの概念を理解していれば、Yii 2.0を簡単に手に入れることができます。
環境
Yii2の主要な要件は、 PHP 5.4 + および* Webサーバー*です。 Yiiは強力なコンソールツールであり、データベースの移行、アセットのコンパイルなどを管理します。 アプリケーションを開発するマシンにコマンドラインでアクセスすることをお勧めします。
開発目的のために、我々は使用します-
- Linux Mint 17.1
- PHP 5.5.9
- PHPビルトインWebサーバー
インストール前のチェック
ローカルマシンが最新のYii2バージョンを使用するのに適しているかどうかを確認するには、次のようにします-
- ステップ1 *-最新のphpバージョンをインストールします。
sudo apt-get install php5
- ステップ2 *-最新のmysqlバージョンをインストールします。
sudo apt-get install mysql-server
- ステップ3 *-Yii2基本アプリケーションテンプレートをダウンロードします。
composer create-project --prefer-dist --stability=dev yiisoft/yii2-app-basic basic
- ステップ4 *-PHP組み込みサーバーを起動するには、_basic_フォルダー内で実行します。
php -S localhost:8080
*requirements.php* という便利なスクリプトがあります。 サーバーがアプリケーションを実行するための要件を満たしているかどうかを確認します。 このスクリプトは、アプリケーションのルートフォルダーにあります。
Webブラウザのアドレスバーに http://localhost:8080/requirements.php と入力すると、ページは次のスクリーンショットに示すようになります-
Yii-インストール
Yii2を使い始める最も簡単な方法は、Yii2チームが提供する基本的なアプリケーションテンプレートを使用することです。 このテンプレートは、Composerツールからも使用できます。
- ステップ1 *-ハードドライブで適切なディレクトリを見つけ、次のコマンドを使用してComposer PHAR(PHPアーカイブ)をダウンロードします。
curl -sS https://getcomposer.org/installer | php
- ステップ2 *-次に、このアーカイブをbinディレクトリに移動します。
mv composer.phar/usr/local/bin/composer
- ステップ3 *-Composerをインストールしたら、Yii2基本アプリケーションテンプレートをインストールできます。 これらのコマンドを実行します。
composer global require "fxp/composer-asset-plugin:~1.1.1"
composer create-project --prefer-dist yiisoft/yii2-app-basic helloworld
最初のコマンドは、 npm およびbowerの依存関係を管理するcomposer assetプラグインをインストールします。 2番目のコマンドは、Yii2基本アプリケーションテンプレートを helloworld というディレクトリにインストールします。
ステップ4 *- *helloworld ディレクトリを開き、PHPに組み込まれたWebサーバーを起動します。
php -S localhost:8080 -t web
ステップ5 *-次に、ブラウザで *http://localhost:8080 を開きます。 ようこそページを見ることができます。
Yii-ページの作成
ここで、アプリケーションに*「Hello world」*ページを作成します。 ページを作成するには、アクションとビューを作成する必要があります。
アクションはコントローラーで宣言されます。 エンドユーザーは、アクションの実行結果を受け取ります。
ステップ1 *-クラスファイルcontrollers/*SiteController.php で定義されている既存の SiteController でspeakアクションを宣言します。
<?php
namespace app\controllers;
use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;
use app\models\LoginForm;
use app\models\ContactForm;
class SiteController extends Controller {
/*other code*/
public function actionSpeak($message = "default message") {
return $this->render("speak",['message' => $message]);
}
}
?>
speakアクションを actionSpeak と呼ばれるメソッドとして定義しました。 Yiiでは、すべてのアクションメソッドの前にactionという単語が付きます。 これが、フレームワークがアクションメソッドと非アクションメソッドを区別する方法です。 アクションIDに複数の単語が必要な場合、それらはダッシュで連結されます。 したがって、アクションID add-postはアクションメソッド actionAddPost に対応します。
上記のコードでは、「out」*関数はGETパラメーター *$ message を取ります。 また、 ’render’ というメソッドを呼び出して、speakというビューファイルをレンダリングします。 メッセージパラメータをビューに渡します。 レンダリング結果は、完全なHTMLページです。
*View* は、応答のコンテンツを生成するスクリプトです。 発言アクションの場合、メッセージを印刷する発言ビューを作成します。 renderメソッドが呼び出されると、 *view/controllerID/vewName.php* としてPHPファイル名を探します。
ステップ2 *-したがって、views/siteフォルダー内に、次のコードで *speak.php というファイルを作成します。
<?php
use yii\helpers\Html;
?>
<?php echo Html::encode($message); ?>
*XSS* 攻撃を回避するために、印刷前にメッセージパラメータをHTMLエンコードすることに注意してください。
ステップ3 *-Webブラウザに次のように入力します *http://localhost:8080/index.php?r = site/speak&message = hello%20world 。
次のウィンドウが表示されます-
URLの 'r' パラメーターはルートを表します。 ルートのデフォルト形式は controllerID/actionID です。 この場合、ルートサイト/スピークは SiteController クラスとスピークアクションによって解決されます。
Yii-アプリケーション構造
全体的なコードベースには、Webサーバーで公開されているフォルダーが1つしかありません。 これはWebディレクトリです。 Webルートディレクトリの外部にある他のフォルダーは、Webサーバーにアクセスできません。
注-すべてのプロジェクトの依存関係は composer.json ファイルにあります。 Yii2には、Composerによってプロジェクトに既に含まれているいくつかの重要なパッケージがあります。 これらのパッケージは次のとおりです-
- Gii –コード生成ツール
- デバッグコンソール
- Codeceptionテストフレームワーク
- SwiftMailerライブラリ
- Twitter Bootstrap UIライブラリ
最初の3つのパッケージは、開発環境でのみ有用です。
Yii2のアプリケーション構造は正確かつ明確です。 次のフォルダが含まれています-
- アセット-このフォルダーには、Webページで参照されるすべての.jsおよび.cssファイルが含まれます。
- コマンド-このフォルダーには、ターミナルから使用できるコントローラーが含まれています。
- Config -このフォルダには、データベース、アプリケーション、およびアプリケーションパラメータを管理するための config ファイルが含まれています。
- メール-このフォルダにはメールレイアウトが含まれます。
- モデル-このフォルダには、アプリケーションで使用されるモデルが含まれます。
- Runtime -このフォルダーは、ランタイムデータを保存するためのものです。
- テスト-このフォルダーには、すべてのテスト(受け入れ、ユニット、機能)が含まれます。
- ベンダー-このフォルダーには、Composerによって管理されるすべてのサードパーティパッケージが含まれています。
- Views -このフォルダーはビュー用であり、コントローラーによって表示されます。 _layout_フォルダーはページテンプレート用です。
- Web -Webからのエントリポイント。
アプリケーション構造
以下は、アプリケーション構造の図表示です。
Yii2 –オブジェクト
次のリストには、すべてのYii2のオブジェクトが含まれています-
モデル、ビュー、コントローラー
モデルはデータ表現用です(通常はデータベースから)。 ビューはデータを表示するためのものです。 コントローラーは、リクエストを処理してレスポンスを生成するためのものです。
コンポーネント
再利用可能な機能を作成するために、ユーザーは独自のコンポーネントを作成できます。 コンポーネントは、ロジックを含むオブジェクトです。 たとえば、コンポーネントは重量コンバータです。
アプリケーションコンポーネント
これらは、アプリケーション全体で一度だけインスタンス化されたオブジェクトです。 コンポーネントとアプリケーションコンポーネントの主な違いは、後者はアプリケーション全体で1つのインスタンスしか持つことができないことです。
ウィジェット
ウィジェットは、ロジックとレンダリングコードの両方を含む再利用可能なオブジェクトです。 ウィジェットは、たとえば、ギャラリースライダーにすることができます。
フィルター
フィルターは、コントローラーアクションの実行前または実行後に実行されるオブジェクトです。
モジュール
モジュールは、モデル、ビュー、コントローラーなどを含む再利用可能なサブアプリと見なすことができます。
拡張機能
拡張機能は、Composerで管理できるパッケージです。
Yii-エントリースクリプト
エントリスクリプトは、リクエスト処理サイクルの開始を担当します。 これらは、ユーザーがアクセスできるPHPスクリプトです。
次の図は、アプリケーションの構造を示しています-
Webアプリケーション(およびコンソールアプリケーション)には、単一のエントリスクリプトがあります。 エンドユーザーはエントリースクリプトにリクエストをします。 次に、エントリスクリプトがアプリケーションインスタンスをインスタンス化し、それらにリクエストを転送します。
コンソールアプリケーションのエントリスクリプトは通常、プロジェクトのベースパスに保存され、 yii.php という名前が付けられます。 Webアプリケーションのエントリスクリプトは、Webアクセス可能なディレクトリの下に保存する必要があります。 多くの場合、 index.php と呼ばれます。
エントリスクリプトは次のことを行います-
- 定数を定義します。
- Composerオートローダーを登録します。
- Yiiファイルを含めます。
- 構成をロードします。
- アプリケーションインスタンスを作成および構成します。
- 着信要求を処理します。
以下は、*基本アプリケーション*テンプレートのエントリスクリプトです-
<?php
//defining global constants
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
//register composer autoloader
require(__DIR__ . '/../vendor/autoload.php');
//include yii files
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
//load application config
$config = require(__DIR__ . '/../config/web.php');
//create, config, and process reques
(new yii\web\Application($config))->run();
?>
以下は、 console アプリケーションのエントリスクリプトです-
#!/usr/bin/env php
<?php
/* *
* Yii console bootstrap file.
*@link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
*@license http://www.yiiframework.com/license/
*/
//defining global constants
defined('YII_DEBUG') or define('YII_DEBUG', true);
//register composer autoloader
require(__DIR__ . '/vendor/autoload.php');
require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');
//load config
$config = require(__DIR__ . '/config/console.php');
//apply config the application instance
$application = new yii\console\Application($config);
//process request
$exitCode = $application->run();
exit($exitCode);
?>
グローバル定数を定義するのに最適な場所は、エントリスクリプトです。 Yii定数によってサポートされている3つがあります-
- YII_DEBUG -デバッグモードであるかどうかを定義します。 trueに設定すると、より多くのログデータと詳細なエラーコールスタックが表示されます。
- YII_ENV -環境モードを定義します。 デフォルト値はprodです。 利用可能な値は、prod、dev、およびtestです。 これらは、たとえば、異なるDB接続(ローカルおよびリモート)または他の値を定義するために構成ファイルで使用されます。
- YII_ENABLE_ERROR_HANDLER -デフォルトのYiiエラーハンドラを有効にするかどうかを指定します。
グローバル定数を定義するには、次のコードが使用されます-
//defining global constants
defined('YII_DEBUG') or define('YII_DEBUG', true);
which is equivalent to:
if(!defined('YII_DEBUG')) {
define('YII_DEBUG', true);
}
注-他のPHPファイルが含まれている場合に有効になるように、グローバルスクリプトはエントリスクリプトの先頭で定義する必要があります。
Yii-コントローラー
コントローラーは、リクエストの処理とレスポンスの生成を担当します。 ユーザーの要求の後、コントローラーは要求データを分析し、それらをモデルに渡し、モデル結果をビューに挿入して、応答を生成します。
アクションを理解する
コントローラーにはアクションが含まれます。 これらは、ユーザーが実行を要求できる基本単位です。 コントローラーには、1つまたは複数のアクションを設定できます。
基本的なアプリケーションテンプレートの SiteController を見てみましょう-
<?php
namespace app\controllers;
use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;
use app\models\LoginForm;
use app\models\ContactForm;
class SiteController extends Controller {
public function behaviors() {
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['logout'],
'rules' => [
[
'actions' => ['logout'],
'allow' => true,
'roles' => ['@'],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'logout' => ['post'],
],
],
];
}
public function actions() {
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
'captcha' => [
'class' => 'yii\captcha\CaptchaAction',
'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
],
];
}
public function actionIndex() {
return $this->render('index');
}
public function actionLogin() {
if (!\Yii::$app->user->isGuest) {
return $this->goHome();
}
$model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && $model->login()) {
return $this->goBack();
}
return $this->render('login', [
'model' => $model,
]);
}
public function actionLogout() {
Yii::$app->user->logout();
return $this->goHome();
}
public function actionContact() {
//load ContactForm model
$model = new ContactForm();
//if there was a POST request, then try to load POST data into a model
if ($model->load(Yii::$app->request->post()) && $model>contact(Yii::$app->params
['adminEmail'])) {
Yii::$app->session->setFlash('contactFormSubmitted');
return $this->refresh();
}
return $this->render('contact', [
'model' => $model,
]);
}
public function actionAbout() {
return $this->render('about');
}
public function actionSpeak($message = "default message") {
return $this->render("speak",['message' => $message]);
}
}
?>
PHP組み込みサーバーを使用して基本的なアプリケーションテンプレートを実行し、 http://localhost:8080/index.php?r = site/contact のWebブラウザーに移動します。 次のページが表示されます-
このページを開くと、 SiteController の連絡先アクションが実行されます。 コードは最初に ContactForm モデルをロードします。 次に、連絡先ビューをレンダリングし、モデルをそこに渡します。
あなたがフォームに記入し、送信ボタンをクリックすると、次が表示されます-
今回は次のコードが実行されることに注意してください-
if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app>params ['adminEmail'])) {
Yii::$app->session->setFlash('contactFormSubmitted');
return $this->refresh();
}
POSTリクエストがあった場合、POSTデータをモデルに割り当て、電子メールを送信しようとします。 成功した場合、「お問い合わせいただきありがとうございます」というテキストを含むフラッシュメッセージを設定します。 できるだけ早く返信いたします。」ページを更新します。
ルートを理解する
上記の例では、URLの* http://localhost:8080/index.php?r = site/contact、のルートは *site/contact です。 SiteController の連絡先アクション( actionContact )が実行されます。
ルートは次の部分で構成されます
- moduleID -コントローラがモジュールに属している場合、ルートのこの部分が存在します。
- controllerID (上記の例のサイト)-同じモジュールまたはアプリケーション内のすべてのコントローラーの中でコントローラーを識別する一意の文字列。
- actionID (上記の例の連絡先)-同じコントローラー内のすべてのアクションの中でアクションを識別する一意の文字列。
ルートの形式は controllerID/actionID です。 コントローラーがモジュールに属している場合は、 moduleID/controllerID/actionID という形式になります。
Yii-コントローラーの使用
Webアプリケーションのコントローラーは、 yii \ web \ Controller またはその子クラスから拡張する必要があります。 コンソールアプリケーションでは、yii \ console \ Controllerまたはその子クラスから拡張する必要があります。
*controllers* フォルダーにコントローラーの例を作成してみましょう。
ステップ1 *- *Controllers フォルダー内で、次のコードを使用して ExampleController.php というファイルを作成します。
<?php
namespace app\controllers;
use yii\web\Controller;
class ExampleController extends Controller {
public function actionIndex() {
$message = "index action of the ExampleController";
return $this->render("example",[
'message' => $message
]);
}
}
?>
ステップ2 *- *views/example フォルダーにサンプルビューを作成します。 そのフォルダー内で、 example.php というファイルを次のコードで作成します。
<?php
echo $message;
?>
各アプリケーションにはデフォルトのコントローラーがあります。 Webアプリケーションの場合、サイトはコントローラーですが、コンソールアプリケーションの場合はヘルプです。 したがって、 http://localhost:8080/index.php URLが開かれると、サイトコントローラーが要求を処理します。 アプリケーション構成でデフォルトのコントローラーを変更できます。
指定されたコードを考慮してください-
'defaultRoute' => 'main'
ステップ3 *-上記のコードを次の *config/web.php に追加します。
<?php
$params = require(__DIR__ . '/params.php');
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
//!!! insert a secret key in the following (if it is empty) - this is
//required by cookie validation
'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
//send all mails to a file by default. You have to set
//'useFileTransport' to false and configure a transport
//for the mailer to send real emails.
'useFileTransport' => true,
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'db' => require(__DIR__ . '/db.php'),
],
//changing the default controller
'defaultRoute' => 'example',
'params' => $params,
];
if (YII_ENV_DEV) {
//configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
return $config;
?>
ステップ4 *-Webブラウザーのアドレスバーに *http://localhost:8080/index.php と入力すると、デフォルトのコントローラーがサンプルのコントローラーであることがわかります。
注-コントローラIDには、小文字の英文字、数字、スラッシュ、ハイフン、およびアンダースコアを含める必要があります。
コントローラIDをコントローラクラス名に変換するには、次のことを行う必要があります-
- ハイフンで区切られたすべての単語の最初の文字を大文字に変換します。
- ハイフンを削除します。
- フォワードスラッシュをバックワードスラッシュに置き換えます。
- コントローラーのサフィックスを追加します。
- コントローラーの名前空間を追加します。
例
- ページは app \ controllers \ PageController になります。
- post-articleは app \ controllers \ PostArticleController になります。
- user/post-articleは app \ controllers \ user \ PostArticleController になります。
- userBlogs/post-articleは app \ controllers \ userBlogs \ PostArticleController になります。
Yii-アクションの使用
コントローラークラスでアクションを作成するには、名前がactionで始まるパブリックメソッドを定義する必要があります。 アクションの戻りデータは、エンドユーザーに送信される応答を表します。
ステップ1 *- *ExampleController でhello-worldアクションを定義しましょう。
<?php
namespace app\controllers;
use yii\web\Controller;
class ExampleController extends Controller {
public function actionIndex() {
$message = "index action of the ExampleController";
return $this->render("example",[
'message' => $message
]);
}
public function actionHelloWorld() {
return "Hello world!";
}
}
?>
ステップ2 *-Webブラウザのアドレスバーに *http://localhost:8080/index.php?r = example/hello-world と入力します。 以下が表示されます。
アクションIDは通常、作成、更新、削除などの動詞です。 これは、アクションがリソースの場合に特定の変更を実行するように設計されることが多いためです。
アクションIDには、これらの文字(小文字の英字、数字、ハイフン、アンダースコア)のみを含める必要があります。
アクションには、インラインとスタンドアロンの2つのタイプがあります。
インラインアクションは、コントローラークラスで定義されます。 アクションの名前は、このようにアクションIDから導出されます-
- アクションIDのすべての単語の最初の文字を大文字にします。
- ハイフンを削除します。
- アクションプレフィックスを追加します。
例-
- インデックスはactionIndexになります。
- hello-world(上記の例のように)はactionHelloWorldになります。
同じアクションを別の場所で再利用する場合は、それをスタンドアロンアクションとして定義する必要があります。
スタンドアロンアクションクラスを作成する
スタンドアロンアクションクラスを作成するには、yii \ base \ Actionまたは子クラスを拡張し、* run()*メソッドを実装する必要があります。
ステップ1 *-プロジェクトルート内にコンポーネントフォルダーを作成します。 そのフォルダー内に、次のコードで *GreetingAction.php というファイルを作成します。
<?php
namespace app\components;
use yii\base\Action;
class GreetingAction extends Action {
public function run() {
return "Greeting";
}
}
?>
再利用可能なアクションを作成しました。 ExampleController で使用するには、action()メソッドをオーバーライドしてアクションマップでアクションを宣言する必要があります。
ステップ2 *- *ExampleController.php ファイルをこの方法で変更します。
<?php
namespace app\controllers;
use yii\web\Controller;
class ExampleController extends Controller {
public function actions() {
return [
'greeting' => 'app\components\GreetingAction',
];
}
public function actionIndex() {
$message = "index action of the ExampleController";
return $this->render("example",[
'message' => $message
]);
}
public function actionHelloWorld() {
return "Hello world!";
}
}
?>
- actions()*メソッドは、値がクラス名であり、キーがアクションIDである配列を返します。
ステップ3 *- *http://localhost:8080/index.php?r = example/greeting に移動します。 次の出力が表示されます。
ステップ4 *-アクションを使用して、ユーザーを他のURLにリダイレクトすることもできます。 *ExampleController.php に次のアクションを追加します。
public function actionOpenGoogle() {
//redirect the user browser to http://google.com
return $this->redirect('http://google.com');
}
これで、 http://localhost:8080/index.php?r = example/open-google を開くと、* http://google.com*にリダイレクトされます。
アクションメソッドは、_action parameters_と呼ばれるパラメーターを取ることができます。 それらの値は、パラメーター名をキーとして使用して $ _ GET から取得されます。
- ステップ5 *-サンプルコントローラに次のアクションを追加します。
public function actionTestParams($first, $second) {
return "$first $second";
}
ステップ6 *-WebブラウザのアドレスバーにURL *http://localhost:8080/index.php?r = example/testparams&first = hello&second = world を入力すると、次の出力が表示されます。
各コントローラーにはデフォルトのアクションがあります。 ルートにコントローラーIDのみが含まれる場合、デフォルトのアクションが要求されることを意味します。 デフォルトでは、アクションは index です。 コントローラでこのプロパティを簡単にオーバーライドできます。
ステップ7 *- *ExampleController をこの方法で変更します。
<?php
namespace app\controllers;
use yii\web\Controller;
class ExampleController extends Controller {
public $defaultAction = "hello-world";
/*other actions*/
}
?>
ステップ8 *- *http://localhost:8080/index.php?r = example にアクセスすると、次のように表示されます。
要求を満たすために、コントローラは次のライフサイクルを経験します-
- yii \ base \ Controller:* init()*メソッドが呼び出されます。
- コントローラーは、アクションIDに基づいてアクションを作成します。
- コントローラーは、Webアプリケーション、モジュール、コントローラーの* beforeAction()*メソッドを順番に呼び出します。
- コントローラーがアクションを実行します。
- コントローラーは、Webアプリケーション、モジュール、コントローラーの* afterAction()*メソッドを順番に呼び出します。
- アプリケーションは、アクションの結果を応答に割り当てます。
重要なポイント
コントローラは-
- 非常に薄くなります。 各アクションには、数行のコードのみを含める必要があります。
- 応答にビューを使用します。
- HTMLを埋め込みません。
- 要求データにアクセスします。
- モデルのメソッドを呼び出します。
- 要求データを処理しません。 これらはモデルで処理する必要があります。
Yii-モデル
モデルは、ビジネスロジックとルールを表すオブジェクトです。 モデルを作成するには、 yii \ base \ Model クラスまたはそのサブクラスを拡張する必要があります。
属性
- 属性はビジネスデータを表します。 配列要素やオブジェクトプロパティのようにアクセスできます。 各属性は、モデルのパブリックにアクセス可能なプロパティです。 モデルが所有する属性を指定するには、* yii \ base \ Model
- attributes()*メソッドをオーバーライドする必要があります。
基本的なアプリケーションテンプレートの ContactForm モデルを見てみましょう。
<?php
namespace app\models;
use Yii;
use yii\base\Model;
/**
*ContactForm is the model behind the contact form.
*/
class ContactForm extends Model {
public $name;
public $email;
public $subject;
public $body;
public $verifyCode;
/**
*@return array the validation rules.
*/
public function rules() {
return [
//name, email, subject and body are required
[[name', 'email', 'subject', 'body'], 'required'],
//email has to be a valid email address
['email', 'email'],
//verifyCode needs to be entered correctly
['verifyCode', 'captcha'],
];
}
/**
*@return array customized attribute labels
*/
public function attributeLabels() {
return [
'verifyCode' => 'Verification Code',
];
}
/**
*Sends an email to the specified email address using the information
collected by this model.
* @param string $email the target email address
*@return boolean whether the model passes validation
*/
public function contact($email) {
if ($this->validate()) {
Yii::$app->mailer->compose()
->setTo($email)
->setFrom([$this->email => $this->name])
->setSubject($this->subject)
->setTextBody($this->body)
->send();
return true;
}
return false;
}
}
?>
ステップ1 *-次のコードを使用して、 *SiteController に actionShowContactModel という関数を作成します。
public function actionShowContactModel() {
$mContactForm = new \app\models\ContactForm();
$mContactForm->name = "contactForm";
$mContactForm->email = "[email protected]";
$mContactForm->subject = "subject";
$mContactForm->body = "body";
var_dump($mContactForm);
}
上記のコードでは、 ContactForm モデルを定義し、属性を設定して、画面にモデルを表示します。
ステップ2 *-Webブラウザのアドレスバーに *http://localhost:8080/index.php?r = site/show-contact-model と入力すると、次のように表示されます。
モデルが yii \ base \ Model から拡張されている場合、そのすべてのメンバー変数(パブリックおよび非静的)は属性です。 ContactForm モデルには、名前、電子メール、件名、本文、 verifyCode の5つの属性があり、新しい属性を簡単に追加できます。
属性ラベル
- 多くの場合、属性に関連付けられたラベルを表示する必要があります。 デフォルトでは、属性ラベルは* yii \ base \ Model
- generateAttributeLabel()メソッドによって自動的に生成されます。 属性ラベルを手動で宣言するには、 yii \ base \ Model :: attributeLabels()*メソッドをオーバーライドできます。
ステップ1 *- http://localhost:8080/index.php?r = site/contactを開くと、次のページが表示されます。
属性ラベルは名前と同じであることに注意してください。
ステップ2 *-次に、 *ContactForm モデルの attributeLabels 関数を次のように変更します。
public function attributeLabels() {
return [
'name' => 'name overridden',
'email' => 'email overridden',
'subject' => 'subject overridden',
'body' => 'body overridden',
'verifyCode' => 'verifyCode overridden',
];
}
ステップ3 *- *http://localhost:8080/index.php?r = site/contact を再度開くと、次の図に示すようにラベルが変更されていることがわかります。
シナリオ
さまざまなシナリオでモデルを使用できます。 たとえば、ゲストが連絡先フォームを送信する場合、すべてのモデル属性が必要です。 ユーザーが同じことをしたいときは、すでにログインしているので、DBから簡単に取得できるため、名前は必要ありません。
シナリオを宣言するには、* scenarios()*関数をオーバーライドする必要があります。 キーがシナリオ名であり、値が*アクティブな属性*である配列を返します。 アクティブな属性は検証する属性です。 また、*大量に*割り当てることもできます。
ステップ1 *-次の方法で *ContactForm モデルを変更します。
<?php
namespace app\models;
use Yii;
use yii\base\Model;
/**
*ContactForm is the model behind the contact form.
*/
class ContactForm extends Model {
public $name;
public $email;
public $subject;
public $body;
public $verifyCode;
const SCENARIO_EMAIL_FROM_GUEST = 'EMAIL_FROM_GUEST';
const SCENARIO_EMAIL_FROM_USER = 'EMAIL_FROM_USER';
public function scenarios() {
return [
self::SCENARIO_EMAIL_FROM_GUEST => ['name', 'email', 'subject',
'body', 'verifyCode'],
self::SCENARIO_EMAIL_FROM_USER => ['email' ,'subject', 'body',
'verifyCode'],
];
}
/**
*@return array the validation rules.
*/
public function rules() {
return [
//name, email, subject and body are required
[[name', 'email', 'subject', 'body'], 'required'],
//email has to be a valid email address
['email', 'email'],
//verifyCode needs to be entered correctly
['verifyCode', 'captcha'],
];
}
/**
*@return array customized attribute labels
*/
public function attributeLabels() {
return [
'name' => 'name overridden',
'email' => 'email overridden',
'subject' => 'subject overridden',
'body' => 'body overridden',
'verifyCode' => 'verifyCode overridden',
];
}
/**
*Sends an email to the specified email address using the information
collected by this model.
* @param string $email the target email address
*@return boolean whether the model passes validation
*/
public function contact($email) {
if ($this -> validate()) {
Yii::$app->mailer->compose()
->setTo($email)
->setFrom([$this->email => $this->name])
->setSubject($this->subject)
->setTextBody($this->body)
->send();
return true;
}
return false;
}
}
?>
2つのシナリオを追加しました。 1つはゲスト用で、もう1つは認証済みユーザー用です。 ユーザーが認証される場合、ユーザーの名前は必要ありません。
ステップ2 *-次に、 *SiteController の actionContact 関数を変更します。
public function actionContact() {
$model = new ContactForm();
$model->scenario = ContactForm::SCENARIO_EMAIL_FROM_GUEST;
if ($model->load(Yii::$app->request->post()) && $model->
contact(Yii::$app->params ['adminEmail'])) {
Yii::$app->session->setFlash('contactFormSubmitted');
return $this->refresh();
}
return $this->render('contact', [
'model' => $model,
]);
}
ステップ3 *-Webブラウザに *http://localhost:8080/index.php?r = site/contact と入力します。 現在、すべてのモデル属性が必要であることがわかります。
ステップ4 *-次のコードに示すように、 *actionContact でモデルのシナリオを変更すると、name属性は不要になります。
$model->scenario = ContactForm::SCENARIO_EMAIL_FROM_USER;
大規模な割り当て
大量の割り当ては、1行のコードで複数の入力属性からモデルを作成する便利な方法です。
コードの行は-
$mContactForm = new \app\models\ContactForm;
$mContactForm->attributes = \Yii::$app->request->post('ContactForm');
上記のコード行は次と同等です-
$mContactForm = new \app\models\ContactForm;
$postData = \Yii::$app->request->post('ContactForm', []);
$mContactForm->name = isset($postData['name']) ? $postData['name'] : null;
$mContactForm->email = isset($postData['email']) ? $postData['email'] : null;
$mContactForm->subject = isset($postData['subject']) ? $postData['subject'] : null;
$mContactForm->body = isset($postData['body']) ? $postData['body'] : null;
前者はずっときれいです。 大規模な割り当て*は*安全な属性*にのみ適用されることに注意してください。 これらは、 scenario()*関数にリストされている現在のシナリオ属性です。
データエクスポート
多くの場合、モデルはさまざまな形式でエクスポートする必要があります。 モデルを配列に変換するには、 SiteController の actionShowContactModel 関数を変更します-
public function actionShowContactModel() {
$mContactForm = new \app\models\ContactForm();
$mContactForm->name = "contactForm";
$mContactForm->email = "[email protected]";
$mContactForm->subject = "subject";
$mContactForm->body = "body";
var_dump($mContactForm->attributes);
}
アドレスバーに http://localhost:8080/index.php?r = site/show-contact-model と入力すると、次のように表示されます-
モデルを JSON 形式に変換するには、次の方法で actionShowContactModel 関数を変更します-
public function actionShowContactModel() {
$mContactForm = new \app\models\ContactForm();
$mContactForm->name = "contactForm";
$mContactForm->email = "[email protected]";
$mContactForm->subject = "subject";
$mContactForm->body = "body";
return \yii\helpers\Json::encode($mContactForm);
}
ブラウザ出力-
{
"name":"contactForm",
"email":"[email protected]",
"subject":"subject",
"body":"body ",
"verifyCode":null
}
重要なポイント
モデルは通常、適切に設計されたアプリケーションのコントローラーよりもはるかに高速です。 モデルは-
- ビジネスロジックが含まれています。
- 検証ルールが含まれます。
- 属性を含む。
- HTMLを埋め込みません。
- リクエストに直接アクセスしません。
- シナリオが多すぎません。
Yii-ウィジェット
ウィジェットは、HTML、CSS、およびJSを含む再利用可能なクライアント側コードです。 このコードには最小限のロジックが含まれており、 yii \ base \ Widget オブジェクトにラップされています。 このオブジェクトを任意のビューに簡単に挿入して適用できます。
ステップ1 *-ウィジェットの動作を確認するには、次のコードを使用して *SiteController に actionTestWidget 関数を作成します。
public function actionTestWidget() {
return $this->render('testwidget');
}
上記の例では、“ testwidget” *という *View を返しました。
ステップ2 *-次に、views/siteフォルダー内に、 testwidget.php。*という名前のViewファイルを作成します。
<?php
use yii\bootstrap\Progress;
?>
<?= Progress::widget(['percent' => 60, 'label' => 'Progress 60%']) ?>
ステップ3 *- *http://localhost:8080/index.php?r = site/test-widget にアクセスすると、プログレスバーウィジェットが表示されます。
ウィジェットを使用する
- View でウィジェットを使用するには、* yii \ base \ Widget
- widget()*関数を呼び出す必要があります。 この関数は、ウィジェットを初期化するための構成配列を受け取ります。 前の例では、構成オブジェクトのパーセントおよびラベル付きパラメーターを含む進行状況バーを挿入しました。
- 一部のウィジェットはコンテンツのブロックを受け取ります。 * yii \ base \ Widget
- begin()関数と yii \ base \ Widget :: end()*関数で囲む必要があります。 たとえば、次のウィジェットは連絡先フォームを表示します-
<?php $form = ActiveForm::begin(['id' => 'contact-form']); ?>
<?= $form->field($model, 'name') ?>
<?= $form->field($model, 'email') ?>
<?= $form->field($model, 'subject') ?>
<?= $form->field($model, 'body')->textArea(['rows' => 6]) ?>
<?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [
'template' =>
'<div class="row">
<div class = "col-lg-3">{image}</div>
<div class = "col-lg-6">{input}</div>
</div>',
]) ?>
<div class = "form-group">
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary',
'name' => 'contact-button']) ?>
</div>
<?php ActiveForm::end(); ?>
ウィジェットを作成する
- ウィジェットを作成するには、 yii \ base \ Widget から拡張する必要があります。 次に、* yii \ base \ Widget
- init()および yii \ base \ Widget :: run()*関数をオーバーライドする必要があります。 * run()*関数はレンダリング結果を返すはずです。 * init()*関数は、ウィジェットのプロパティを正規化する必要があります。
ステップ1 *-プロジェクトルートにコンポーネントフォルダを作成します。 そのフォルダー内で、 *FirstWidget.php というファイルを次のコードで作成します。
<?php
namespace app\components;
use yii\base\Widget;
class FirstWidget extends Widget {
public $mes;
public function init() {
parent::init();
if ($this->mes === null) {
$this->mes = 'First Widget';
}
}
public function run() {
return "<h1>$this->mes</h1>";
}
}
?>
ステップ2 *- *testwidget ビューを次の方法で変更*します。
<?php
use app\components\FirstWidget;
?>
<?= FirstWidget∷widget() ?>
ステップ3 *- *http://localhost:8080/index.php?r = site/test-widget に移動します。 以下が表示されます。
ステップ4 *- begin()呼び出しと end()呼び出しの間でコンテンツを囲むには、 *FirstWidget.php ファイルを変更する必要があります。
<?php
namespace app\components;
use yii\base\Widget;
class FirstWidget extends Widget {
public function init() {
parent::init();
ob_start();
}
public function run() {
$content = ob_get_clean();
return "<h1>$content</h1>";
}
}
?>
- ステップ5 *-すべてのコンテンツをh1タグで囲みます。 * ob_start()*関数を使用して出力をバッファリングすることに注意してください。 次のコードに示すように、testwidgetビューを変更します。
<?php
use app\components\FirstWidget;
?>
<?php FirstWidget::begin(); ?>
First Widget in H1
<?php FirstWidget::end(); ?>
次の出力が表示されます-
重要なポイント
ウィジェットは-
- MVCパターンに従って作成されます。 プレゼンテーション層をビューに、ウィジェットクラスにロジックを保持する必要があります。
- 自己完結型になるように設計されている。 最終開発者はそれをビューに設計できるはずです。
Yii-モジュール
モジュールは、独自のモデル、ビュー、コントローラー、および場合によっては他のモジュールを持つエンティティです。 実際には、アプリケーション内のアプリケーションです。
ステップ1 *-プロジェクトルート内に *modules というフォルダーを作成します。 モジュールフォルダー内に、 hello という名前のフォルダーを作成します。 これは、Helloモジュールの基本フォルダーになります。
ステップ2 *- *hello フォルダー内で、次のコードを使用して Hello.php ファイルを作成します。
<?php
namespace app\modules\hello;
class Hello extends \yii\base\Module {
public function init() {
parent::init();
}
}
?>
モジュールクラスを作成しました。 これは、モジュールのベースパスの下に配置する必要があります。 モジュールにアクセスするたびに、対応するモジュールクラスのインスタンスが作成されます。 * init()*関数は、モジュールのプロパティを初期化するためのものです。
ステップ3 *-次に、helloフォルダー内にコントローラーとビューの2つのディレクトリを追加します。 *CustomController.php ファイルをコントローラーのフォルダーに追加します。
<?php
namespace app\modules\hello\controllers;
use yii\web\Controller;
class CustomController extends Controller {
public function actionGreet() {
return $this->render('greet');
}
}
?>
モジュールを作成するときの規則は、コントローラークラスをモジュールのベースパスのコントローラーのディレクトリに配置することです。 greet ビューを返すだけの actionGreet 関数を定義しました。
モジュール内のビューは、モジュールのベースパスのビューフォルダーに配置する必要があります。 ビューがコントローラーによってレンダリングされる場合、それらは controllerID に対応するフォルダーに配置する必要があります。 カスタム*フォルダーを *views フォルダーに追加します。
ステップ4 *-カスタムディレクトリ内で、次のコードを使用して *greet.php というファイルを作成します。
<h1>Hello world from custom module!</h1>
*actionGreet* の *View* を作成しました。 この新しく作成されたモジュールを使用するには、アプリケーションを構成する必要があります。 モジュールをアプリケーションのmodulesプロパティに追加する必要があります。
ステップ5 *- *config/web.php ファイルを変更します。
<?php
$params = require(__DIR__ . '/params.php');
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
//!!! insert a secret key in the following (if it is empty) - this is
//required by cookie validation
'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
//send all mails to a file by default. You have to set
//'useFileTransport' to false and configure a transport
//for the mailer to send real emails.
'useFileTransport' => true,
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'db' => require(__DIR__ . '/db.php'),
],
'modules' => [
'hello' => [
'class' => 'app\modules\hello\Hello',
],
],
'params' => $params,
];
if (YII_ENV_DEV) {
//configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
return $config;
?>
モジュールのコントローラーのルートは、モジュールIDで始まり、その後にコントローラーIDとアクションIDが続く必要があります。
ステップ6 *-アプリケーションで *actionGreet を実行するには、次のルートを使用する必要があります。
hello/custom/greet
helloはモジュールID、customは*コントローラーID *、greetは*アクションID *です。
ステップ7 *-ここで、 *http://localhost:8080/index.php?r = hello/custom/greet と入力すると、次の出力が表示されます。
重要なポイント
モジュールは-
- 大規模なアプリケーションで使用されます。 その機能をいくつかのグループに分ける必要があります。 各機能グループはモジュールとして開発できます。
- 再利用可能です。 SEO管理やブログ管理などの一般的に使用される機能はモジュールとして開発できるため、将来のプロジェクトで簡単に再利用できます。
Yii-ビュー
ビューは、エンドユーザーにデータを表示する役割を果たします。 Webアプリケーションでは、 Views はHTMLおよびPHPコードを含む単なるPHPスクリプトファイルです。
ビューを作成する
ステップ1 *-基本的なアプリケーションテンプレートの「About」*ビューを見てみましょう。
<?php
/*@var $this yii\web\View*/
use yii\helpers\Html;
$this->title = 'About';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="site-about">
<h1><?= Html::encode($this->title) ?></h1>
<p>
This is the About page. You may modify the following file to customize its content:
</p>
<code><?= __FILE__ ?></code>
</div>
*$ this* 変数は、このビューテンプレートを管理およびレンダリングするビューコンポーネントを参照します。
これは、*「About」*ページがどのように見えるかです-
- XSS攻撃を回避するために、エンドユーザーからのデータをエンコードおよび/またはフィルタリングすることが重要です。 * yii \ helpers \ Html
- encode()を呼び出してプレーンテキストをエンコードし、 *yii \ helpers \ HtmlPurifier を呼び出してHTMLコンテンツを常にエンコードする必要があります。
ステップ2 *-「About」*ビューを次のように変更します。
<?php
/*@var $this yii\web\View*/
use yii\helpers\Html;
use yii\helpers\HtmlPurifier;
$this->title = 'About';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="site-about">
<h1><?= Html::encode($this->title) ?></h1>
<p>
This is the About page. You may modify the following file to customize its content:
</p>
<p>
<?= Html::encode("<script>alert('alert!');</script><h1>ENCODE EXAMPLE</h1>>") ?>
</p>
<p>
<?= HtmlPurifier::process("<script>alert('alert!');</script><h1> HtmlPurifier EXAMPLE</h1>") ?>
</p>
<code><?= __FILE__ ?></code>
</div>
ステップ3 *- *http://localhost:8080/index.php?r = site/about と入力します。 次の画面が表示されます。
- Html :: encode()関数内のJavaScriptコードはプレーンテキストとして表示されることに注意してください。 同じことは、 HtmlPurifier :: process()*呼び出しにも当てはまります。 h1タグのみが表示されています。
ビューはこれらの規則に従います-
- コントローラーによってレンダリングされるビューは、 @ app/views/controllerID フォルダーに配置する必要があります。
- ウィジェットでレンダリングされるビューは、* widgetPath/viewsフォルダー*に配置する必要があります。
コントローラ内で*ビューをレンダリングするには、*次の方法を使用できます-
- * render()*-ビューをレンダリングし、レイアウトを適用します。
- * renderPartial()*-レイアウトなしでビューをレンダリングします。
- * renderAjax()*-レイアウトなしでビューをレンダリングしますが、登録されているすべてのjsおよびcssファイルを挿入します。
- * renderFile()*-指定されたファイルパスまたはエイリアスでビューをレンダリングします。
- * renderContent()*-静的な文字列をレンダリングし、レイアウトを適用します。
別のビュー内の*ビューをレンダリングするには、次の方法を使用することができます-
- * render()*-ビューをレンダリングします。
- * renderAjax()*-レイアウトなしでビューをレンダリングしますが、登録されているすべてのjsおよびcssファイルを挿入します。
- * renderFile()*-指定されたファイルパスまたはエイリアスでビューをレンダリングします。
ステップ4 *-views/siteフォルダー内に、 *_ part1.phpと_part2.php の2つのビューファイルを作成します。
*_part1.php* -
<h1>PART 1</h1>
*_part2.php* -
<h1>PART 2</h1>
ステップ5 *-最後に、これら2つの新しく作成されたビューを「About」*ビュー内にレンダリングします。
<?php
/*@var $this yii\web\View*/
use yii\helpers\Html;
$this->title = 'About';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="site-about">
<h1><?= Html::encode($this->title) ?></h1>
<p>
This is the About page. You may modify the following file to customize its content:
</p>
<?= $this->render("_part1") ?>
<?= $this->render("_part2") ?>
<code><?= __FILE__ ?></code>
</div>
次の出力が表示されます-
ビューをレンダリングするとき、ビュー名またはビューファイルパス/エイリアスとして使用してビューを定義できます。 ビュー名は次の方法で解決されます-
- ビュー名では拡張子を省略できます。 たとえば、aboutビューはabout.phpファイルに対応しています。
- ビュー名が「/」で始まり、現在アクティブなモジュールがフォーラムで、ビュー名がコメント/投稿の場合、パスは@ app/modules/forum/views/comment/postになります。 アクティブなモジュールがない場合、パスは@ app/views/comment/postになります。
- ビュー名が「//」で始まる場合、対応するパスは@ app/views/ViewNameになります。 たとえば、//site/contactは@ app/views/site/contact.phpに対応します。
- ビュー名がcontactで、コンテキストコントローラーがSiteControllerの場合、パスは@ app/views/site/contact.phpになります。
- 価格ビューが商品ビュー内でレンダリングされる場合、価格が@ app/views/invoice/goods.phpでレンダリングされる場合、価格は@ app/views/invoice/price.phpとして解決されます。
ビューでデータにアクセスする
ビュー内のデータにアクセスするには、データを2番目のパラメーターとしてビューのレンダリングメソッドに渡す必要があります。
ステップ1 *- *SiteController の actionAbout を変更します。
public function actionAbout() {
$email = "[email protected]";
$phone = "+78007898100";
return $this->render('about',[
'email' => $email,
'phone' => $phone
]);
}
上記のコードでは、2つの変数 $ email と $ phone を渡して、 About ビューでレンダリングします。
- ステップ2 *-aboutビューのコードを変更します。
<?php
/*@var $this yii\web\View*/
use yii\helpers\Html;
$this->title = 'About';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class = "site-about">
<h1><?= Html::encode($this->title) ?></h1>
<p>
This is the About page. You may modify the following file to customize its content:
</p>
<p>
<b>email:</b> <?= $email ?>
</p>
<p>
<b>phone:</b> <?= $phone ?>
</p>
<code><?= __FILE__ ?></code>
</div>
*SiteController* から受け取った2つの変数を追加しました。
ステップ3 *-WebブラウザにURL *http://localhost:8080/index.php?r = site/about を入力すると、次のように表示されます。
Yii-レイアウト
レイアウトは、複数のビューの共通部分を表します。 たとえば、ページのヘッダーとフッター。 デフォルトでは、レイアウトは views/layouts フォルダーに保存する必要があります。
基本的なアプリケーションテンプレートのメインレイアウトを見てみましょう-
<?php
/*@var $this \yii\web\View*/
/*@var $content string*/
use yii\helpers\Html;
use yii\bootstrap\Nav;
use yii\bootstrap\NavBar;
use yii\widgets\Breadcrumbs;
use app\assets\AppAsset;
AppAsset::register($this);
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang = "<?= Yii::$app->language ?>">
<head>
<meta charset = "<?= Yii::$app->charset ?>">
<meta name = "viewport" content = "width = device-width, initial-scale = 1">
<?= Html::csrfMetaTags() ?>
<title><?= Html::encode($this->title) ?></title>
<?php $this->head() ?>
</head>
<body>
<?php $this->beginBody() ?>
<div class = "wrap">
<?php
NavBar::begin([
'brandLabel' => 'My Company',
'brandUrl' => Yii::$app->homeUrl,
'options' => [
'class' => 'navbar-inverse navbar-fixed-top',
],
]);
echo Nav::widget([
'options' => ['class' => 'navbar-nav navbar-right'],
'items' => [
['label' => 'Home', 'url' => ['/site/index']],
['label' => 'About', 'url' => ['/site/about']],
['label' => 'Contact', 'url' => ['/site/contact']],
Yii::$app->user->isGuest ?
['label' => 'Login', 'url' => ['/site/login']] :
[
'label' => 'Logout (' . Yii::$app->user->identity->username.')',
'url' => ['/site/logout'],
'linkOptions' => ['data-method' => 'post']
],
],
]);
NavBar::end();
?>
<div class = "container">
<?= Breadcrumbs::widget([
'links' => isset($this->params['breadcrumbs']) ? $this>params
['breadcrumbs'] : [],
]) ?>
<?= $content ?>
</div>
</div>
<footer class = "footer">
<div class = "container">
<p class = "pull-left">© My Company <?= date('Y') ?></p>
<p class = "pull-right"><?= Yii::powered() ?></p>
</div>
</footer>
<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>
このレイアウトは、すべてのページに共通のHTMLページを生成します。 $ content 変数は、コンテンツビューのレンダリング結果です。 次のメソッドは、レンダリングプロセスに関するイベントをトリガーし、他の場所に登録されたスクリプトとタグを適切に挿入できるようにします-
- * head()*-_head_セクション内で呼び出す必要があります。 プレースホルダーを生成します。プレースホルダーは、ヘッドの位置をターゲットにした登録済みHTMLに置き換えられます。
- * beginBody()-_body_セクションの先頭で呼び出す必要があります。 *EVENT_BEGIN_BODY イベントをトリガーします。 本文の開始位置をターゲットとする登録済みHTMLに置き換えられるプレースホルダーを生成します。
- * endBody()-_body_セクションの最後で呼び出す必要があります。 *EVENT_END_BODY イベントをトリガーします。 プレースホルダーを生成します。プレースホルダーは、ボディの終了位置をターゲットにした登録済みHTMLに置き換えられます。
- * beginPage()-レイアウトの最初に呼び出す必要があります。 *EVENT_BEGIN_PAGE イベントをトリガーします。
- * endPage()-レイアウトの最後に呼び出す必要があります。 *EVENT_END_PAGE イベントをトリガーします。
レイアウトを作成する
ステップ1 *-views/layoutsディレクトリ内で、次のコードで *newlayout.php というファイルを作成します。
<?php
/*@var $this \yii\web\View*/
/*@var $content string*/
use yii\helpers\Html;
use yii\bootstrap\Nav;
use yii\bootstrap\NavBar;
use yii\widgets\Breadcrumbs;
use app\assets\AppAsset;
AppAsset::register($this);
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang = "<?= Yii::$app->language ?>">
<head>
<meta charset = "<?= Yii::$app->charset ?>">
<meta name = "viewport" content = "width = device-width, initial-scale = 1">
<? = Html::csrfMetaTags() ?>
<title><? = Html::encode($this->title) ?></title>
<?php $this->head() ?>
</head>
<body>
<?php $this->beginBody() ?>
<div class = "wrap">
<div class = "container">
<? = $content ?>
</div>
</div>
<footer class = "footer">
<div class = "container">
<p class = "pull-left">© My Company <?= date('Y') ?></p>
<p class = "pull-right"><? = Yii::powered() ?></p>
</div>
</footer>
<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>
トップメニューバーを削除しました。
ステップ2 *-このレイアウトを *SiteController に適用するには、 $ layout プロパティを SiteController クラスに追加します。
<?php
namespace app\controllers;
use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;
use app\models\LoginForm;
use app\models\ContactForm;
class SiteController extends Controller {
public $layout = “newlayout”;
/*other methods*/
}
?>
- ステップ3 *-SiteControllerの任意のビューでWebブラウザーに移動すると、レイアウトが変更されたことがわかります。
- ステップ4 *-さまざまなメタタグを登録するには、コンテンツビューで yii \ web \ View
- registerMetaTag()*を呼び出すことができます。
ステップ5 *- *SiteController の 'About' ビューを変更します。
<?php
/*@var $this yii\web\View*/
use yii\helpers\Html;
$this->title = 'About';
$this->params['breadcrumbs'][] = $this->title;
$this->registerMetaTag(['name' => 'keywords', 'content' => 'yii, developing, views,
meta, tags']);
$this->registerMetaTag(['name' => 'description', 'content' => 'This is the description
of this page!'], 'description');
?>
<div class="site-about">
<h1><?= Html::encode($this->title) ?></h1>
<p>
This is the About page. You may modify the following file to customize its content:
</p>
<code><?= __FILE__ ?></code>
</div>
- キーワードと説明*という2つのメタタグを登録しました。
ステップ6 *-次のスクリーンショットに示すように、 http://localhost:8080/index.php?r = site/about、*に移動すると、ページのヘッドセクションにメタタグがあります。
ビューはいくつかのイベントをトリガーします-
- EVENT_BEGIN_BODY -* yii \ web \ View :: beginBody()*の呼び出しによってレイアウトでトリガーされます。
- EVENT_END_BODY -* yii \ web \ View :: endBody()*の呼び出しによってレイアウトでトリガーされます。
- EVENT_BEGIN_PAGE -* yii \ web \ View :: beginPage()*の呼び出しによってレイアウトでトリガーされます。
- EVENT_END_PAGE -* yii \ web \ View :: endPage()*の呼び出しによってレイアウトでトリガーされます。
- EVENT_BEFORE_RENDER -ファイルのレンダリングの開始時にコントローラーでトリガーされます。
- EVENT_AFTER_RENDER -ファイルのレンダリング後にトリガーされます。
これらのイベントに応答して、コンテンツをビューに注入できます。
ステップ7 *- *SiteController の actionAbout に現在の日付と時刻を表示するには、この方法で変更します。
public function actionAbout() {
\Yii::$app->view->on(View::EVENT_BEGIN_BODY, function () {
echo date('m.d.Y H:i:s');
});
return $this->render('about');
}
ステップ8 *-Webブラウザのアドレスバーに *http://localhost:8080/index.php?r = site/about と入力すると、次のように表示されます。
重要なポイント
ビューをより管理しやすくするには、次のようにする必要があります-
- 複雑なビューをいくつかの小さなビューに分割します。
- 一般的なHTMLセクション(ヘッダー、フッター、メニューなど)のレイアウトを使用します。
- ウィジェットを使用します。
ビューは-
- データをフォーマットおよびレンダリングするためのHTMLおよび単純なPHPコードが含まれています。
- 要求を処理しません。
- モデルのプロパティを変更しないでください。
- データベースクエリを実行しません。
Yii-資産
アセットとは、Webページで参照されるファイル(css、js、ビデオ、オーディオ、画像など)です。 Yiiは*アセットバンドル*でアセットを管理します。 アセットバンドルの目的は、関連する JS または CSS ファイルのグループをコードベースに保持し、それらを単一のPHP呼び出し内で登録できるようにすることです。 アセットバンドルは、他のアセットバンドルに依存する場合もあります。
アセットフォルダー内には、基本的なアプリケーションテンプレートのアセットバンドルがあります-
<?php
namespace app\assets;
use yii\web\AssetBundle;
/**
*@author Qiang Xue <[email protected]>
* @since 2.0
*/
class AppAsset extends AssetBundle {
public $basePath = '@webroot';
public $baseUrl = '@web';
public $css = [
'css/site.css',
];
public $js = [];
public $depends = [
'yii\web\YiiAsset',
'yii\bootstrap\BootstrapAsset',
];
}
?>
上記のクラスは、アセットファイルがURL @ web に対応する @ webroot フォルダー内にあることを指定します。 バンドルには JS ファイルと単一の CSS ファイルが含まれていません。 バンドルは他のバンドルに依存しています-
- yii \ web \ YiiAssetおよびyii \ bootstrap \ BootstrapAsset。*
AssetBundleのプロパティ
AssetBundleのプロパティは次のとおりです。
- basePath -このバンドル内のアセットファイルを含むWebアクセス可能なディレクトリを定義します。
- baseUrl -basePathプロパティに対応するURLを指定します。
- js -このバンドルに含まれるJSファイルの配列を定義します。
- css -このバンドルに含まれるCSSファイルの配列を定義します。
- depends -このバンドルが依存するアセットバンドルの配列を定義します。 つまり、現在のアセットバンドルのCSSファイルとJSファイルは、 depends プロパティで宣言されているバンドルの後に含まれることになります。
- sourcePath -アセットファイルを含むルートディレクトリを定義します。 ルートディレクトリにWebアクセスできない場合は、このプロパティを設定する必要があります。 それ以外の場合は、 basePath および baseUrl プロパティを設定する必要があります。
- cssOptions -* yii \ web \View∷registerCssFile*関数に渡されるオプションを定義します。
- jsOptions - yii \ web \ View :: registerJsFile 関数に渡されるオプションを定義します。
- publishOptions : yii \ web \ AssetManager :: publish 関数に渡されるオプションを指定します。
資産の分類
場所に応じて、資産は次のように分類できます-
- ソースアセット-アセットは、Web経由で直接アクセスできないディレクトリにあります。 ページでソースアセットを使用するには、Webディレクトリにコピーする必要があります。 このプロセスは*アセット発行*と呼ばれます。
- 公開されたアセット-アセットはWebアクセス可能なディレクトリにあります
- 外部アセット-アセットは別のWebサーバーにあります。
アセットバンドルの使用
ステップ1 *- *assets フォルダー内で、次の内容の DemoAsset.php という新しいファイルを作成します。
<?php
namespace app\assets;
use yii\web\AssetBundle;
class DemoAsset extends AssetBundle {
public $basePath = ‘@webroot’;
public $baseUrl = ‘@web’;
public $js = [‘js/demo.js’];
}
?>
- ステップ2 *-単一のdemo.jsファイルで新しいアセットバンドルを宣言しました。 次に、web/jsフォルダー内で、このコードを使用してdemo.jsというファイルを作成します。
console.log("hello from demo asset");
- ステップ3 *-新しく作成されたアセットバンドルを登録するには、views/layoutsディレクトリに移動し、main.phpファイルの上部に次の行を追加します。
\app\assets\DemoAsset::register($this);
ステップ4 *-Webブラウザで *http://localhost:8080/index.php を指定すると、次のChromeコンソール出力が表示されます。
*jsOptions* および *cssOptions* プロパティを定義して、 *CSS* および *JS* ファイルをページに含める方法をカスタマイズすることもできます。 デフォルトでは、JSファイルはbody終了タグの前に含まれます。
ステップ5 *-ヘッドセクションに *JS ファイルを含めるには、次の方法で DemoAsset.php ファイルを変更します。
<?php
namespace app\assets;
use yii\web\AssetBundle;
use yii\web\View;
class DemoAsset extends AssetBundle {
public $basePath = '@webroot';
public $baseUrl = '@web';
public $js = ['js/demo.js'];
public $jsOptions = ['position' => View::POS_HEAD];
}
?>
ステップ6 *-ここで http://localhost:8080/index.phpに移動します*。 demo.js スクリプトがページのヘッドセクションに含まれていることがわかります。
プロダクションモードで実行されているWebアプリケーションでは、アセットのHTTPキャッシングを有効にすることが一般的です。 これにより、公開されたすべてのアセットに最終変更タイムスタンプが追加されます。
ステップ7 *- *config フォルダーに移動し、次のコードに示すように web.php ファイルを変更します。
<?php
$params = require(__DIR__ . '/params.php');
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'assetManager' => [
'appendTimestamp' => true,
],
'request' => [
//!!! insert a secret key in the following (if it is empty) - this is
//required by cookie validation
'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
//send all mails to a file by default. You have to set
//'useFileTransport' to false and configure a transport
//for the mailer to send real emails.
'useFileTransport' => true,
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'db' => require(__DIR__ . '/db.php'),
],
'modules' => [
'hello' => [
'class' => 'app\modules\hello\Hello',
],
],
'params' => $params,
];
if (YII_ENV_DEV) {
//configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
return $config;
?>
*AssetManager* コンポーネントを追加し、 *appendTimestamp* プロパティを設定しました。
ステップ8 *-Webブラウザのアドレスバーに *http://localhost:8080/index.php と入力します。 次の画像に示すように、すべてのアセットにタイムスタンプが追加されていることがわかります。
コアYiiアセットバンドル
コアYii Assetbundleは次のとおりです。
- yii \ web \ JqueryAsset -jquery.jsファイルが含まれています。
- yii \ web \ YiiAsset -モジュールでJSコードを整理するメカニズムを実装するyii.jsファイルが含まれています。
- yii \ bootstrap \ BootstrapAsset -Twitter BootstrapフレームワークのCSSファイルが含まれます。
- yii \ bootstrap \ BootstrapPluginAsset -Twitter BootstrapフレームワークのJSファイルが含まれます。
- yii \ jui \ JuiAsset -jQuery UIライブラリのCSSおよびJSファイルが含まれます。
Yii-資産変換
開発者は、 CSS または JS コードを記述する代わりに、* LESS、SCSS、* CSSのStylus、TypeScript、JSのCoffeeScriptなどの拡張構文をよく使用します。 次に、特別なツールを使用して、これらのファイルを実際のCSSおよびJSに変換します。
Yiiのアセットマネージャーは、拡張構文のアセットをCSSとJSに自動的に変換します。 ビューがレンダリングされると、拡張構文の元のアセットではなく、CSSファイルとJSファイルがページに含まれます。
ステップ1 *-この方法で *DemoAsset.php ファイルを変更します。
<?php
namespace app\assets;
use yii\web\AssetBundle;
use yii\web\View;
class DemoAsset extends AssetBundle {
public $basePath = '@webroot';
public $baseUrl = '@web';
public $js = [
'js/demo.js',
'js/greeting.ts'
];
public $jsOptions = ['position' => View::POS_HEAD];
}
?>
typescriptファイルを追加しました。
ステップ2 *- *web/js ディレクトリ内で、次のコードで greeting.ts というファイルを作成します。
class Greeter {
constructor(public greeting: string) { }
greet() {
return this.greeting;
}
};
var greeter = new Greeter("Hello from typescript!");
console.log(greeter.greet());
上記のコードでは、1つのメソッド* greet()*でGreeterクラスを定義しています。 挨拶をChromeコンソールに書き込みます。
ステップ3 *-URL *http://localhost:8080/index.php に移動します。 次のスクリーンショットに示すように、 greeting.ts ファイルがgreeting.jsファイルに変換されていることがわかります。
出力は次のようになります。
Yii-拡張機能
拡張機能は、Yiiアプリケーションで使用するために特別に設計されたパッケージです。 独自のコードを拡張機能として共有したり、サードパーティの拡張機能を使用してアプリケーションに機能を追加したりできます。
拡張機能を使用する
ほとんどの拡張機能はComposerパッケージとして配布されます。 Composerは、ComposerパッケージのリポジトリであるPackagistからパッケージをインストールします。
サードパーティの拡張機能をインストールするには、次のようにする必要があります-
- 拡張機能を composer.json ファイルに追加します。
- composer installを実行します。
日付と時刻ウィジェットの追加
プロジェクトにきちんとした datetime ウィジェットを追加しましょう。
ステップ1 *-この方法で、基本アプリケーションテンプレートの *composer.json ファイルを変更します。
{
"name": "yiisoft/yii2-app-basic",
"description": "Yii 2 Basic Project Template",
"keywords": ["yii2", "framework", "basic", "project template"],
"homepage": "http://www.yiiframework.com/",
"type": "project",
"license": "BSD-3-Clause",
"support": {
"issues": "https://github.com/yiisoft/yii2/issues?state=open",
"forum": "http://www.yiiframework.com/forum/",
"wiki": "http://www.yiiframework.com/wiki/",
"irc": "irc://irc.freenode.net/yii",
"source": "https://github.com/yiisoft/yii2"
},
"minimum-stability": "stable",
"require": {
"php": ">=5.4.0",
"yiisoft/yii2": ">=2.0.5",
"yiisoft/yii2-bootstrap": "*",
"yiisoft/yii2-swiftmailer": "*",
"kartik-v/yii2-widget-datetimepicker": "*"
},
"require-dev": {
"yiisoft/yii2-codeception": "*",
"yiisoft/yii2-debug": "*",
"yiisoft/yii2-gii": "*",
"yiisoft/yii2-faker": "*"
},
"config": {
"process-timeout": 1800
},
"scripts": {
"post-create-project-cmd": [
"yii\\composer\\Installer::postCreateProject"
]
},
"extra": {
"yii\\composer\\Installer::postCreateProject": {
"setPermission": [
{
"runtime": "0777",
"web/assets": "0777",
"yii": "0755"
}
],
"generateCookieValidationKey": [
"config/web.php"
]
},
"asset-installer-paths": {
"npm-asset-library": "vendor/npm",
"bower-asset-library": "vendor/bower"
}
}
}
必要なセクションに依存関係* "kartik-v/yii2-widget-datetimepicker": "*" *を追加しました。
- ステップ2 *-次に、プロジェクトルート内でcomposer updateを実行し、すべての依存関係を更新します。
拡張機能をインストールしました。 vendor/kartik-v/yii2widget-datetimepicker フォルダー内にあります。
ステップ3 *-ページに新しくインストールされたウィジェットを表示するには、 *SiteController の actionAbout メソッドの About ビューを変更します。
<?php
/*@var $this yii\web\View*/
use kartik\datetime\DateTimePicker;
use yii\helpers\Html;
$this->title = 'About';
$this->params['breadcrumbs'][] = $this->title;
$this->registerMetaTag(['name' => 'keywords', 'content' => 'yii, developing, views,
meta, tags']);
$this->registerMetaTag(['name' => 'description',
'content' => 'This is the description of this page!'], 'description');
?>
<div class="site-about">
<h1><?= Html::encode($this->title) ?></h1>
<p>
This is the About page. You may modify the following file to customize its content:
</p>
<?php
echo DateTimePicker::widget([
'name' => 'dp_1',
'type' => DateTimePicker::TYPE_INPUT,
'value' => '23-Feb-1982 10:10',
'pluginOptions' => [
'autoclose'=>true,
'format' => 'dd-M-yyyy hh:ii'
]
]);
?>
</div>
ステップ4 *-次に、 *php -S localhost:8080t web コマンドを使用して、プロジェクトルートから組み込みのPHPサーバーを実行します。
ステップ5 *- http://localhost:8080/index.php?r = site/about。に移動します。次のスクリーンショットに示すように、きちんとした *datetime ピッカーが表示されます。
Yii-拡張機能の作成
標準の*「Hello world」*メッセージを表示する簡単な拡張機能を作成しましょう。 この拡張機能は、Packagistリポジトリを介して配布されます。
ステップ1 *-ハードドライブに *hello-world というフォルダーを作成しますが、Yii基本アプリケーションテンプレート内には作成しません)。 hello-worldディレクトリ内で、次のコードを使用して composer.json という名前のファイルを作成します。
{
"name": "finddevguides/hello-world",
"authors": [
{
"name": "finddevguides"
}
],
"require": {},
"autoload": {
"psr-0": {
"HelloWorld": "src/"
}
}
}
PSR-0標準を使用しており、すべての拡張ファイルは src フォルダーの下にあると宣言しました。
ステップ2 *-次のディレクトリパスを作成します: *hello-world/src/HelloWorld 。
ステップ3 *- *HelloWorld フォルダー内で、次のコードで SayHello.php というファイルを作成します。
<?php
namespace HelloWorld;
class SayHello {
public static function world() {
return 'Hello World, Composer!';
}
}
?>
*hello* メッセージを返すworld static関数で *SayHello* クラスを定義しました。
ステップ4 *-拡張機能の準備ができました。 *github アカウントで空のリポジトリを作成し、この拡張機能をそこにプッシュします。
*hello-world* フォルダー内で実行-
- git init
- git add
- git commit -m“初期コミット”
- git remote add origin <YOUR_NEWLY_CREATED_REPOSITORY>
- git push -u元マスター
拡張機能を github に送信しました。 ここで、* [[1]]をクリックします。
githubリポジトリを入力して公開するページが表示されます。
ステップ5 *-「チェック」*ボタンをクリックすると、拡張機能が公開されます。
ステップ6 *-基本的なアプリケーションテンプレートに戻ります。 *composer.json に拡張子を追加します。
{
"name": "yiisoft/yii2-app-basic",
"description": "Yii 2 Basic Project Template",
"keywords": ["yii2", "framework", "basic", "project template"],
"homepage": "http://www.yiiframework.com/",
"type": "project",
"license": "BSD-3-Clause",
"support": {
"issues": "https://github.com/yiisoft/yii2/issues?state=open",
"forum": "http://www.yiiframework.com/forum/",
"wiki": "http://www.yiiframework.com/wiki/",
"irc": "irc://irc.freenode.net/yii",
"source": "https://github.com/yiisoft/yii2"
},
"minimum-stability": "dev",
"prefer-stable" : true,
"require": {
"php": ">=5.4.0",
"yiisoft/yii2": ">=2.0.5",
"yiisoft/yii2-bootstrap": "*",
"yiisoft/yii2-swiftmailer": "*",
"kartik-v/yii2-widget-datetimepicker": "*",
"finddevguides/hello-world": "*"
},
"require-dev": {
"yiisoft/yii2-codeception": "*",
"yiisoft/yii2-debug": "*",
"yiisoft/yii2-gii": "*",
"yiisoft/yii2-faker": "*"
},
"config": {
"process-timeout": 1800
},
"scripts": {
"post-create-project-cmd": [
"yii\\composer\\Installer::postCreateProject"
]
},
"extra": {
"yii\\composer\\Installer::postCreateProject": {
"setPermission": [
{
"runtime": "0777",
"web/assets": "0777",
"yii": "0755"
}
],
"generateCookieValidationKey": [
"config/web.php"
]
},
"asset-installer-paths": {
"npm-asset-library": "vendor/npm",
"bower-asset-library": "vendor/bower"
}
}
}
ステップ7 *-プロジェクトルートフォルダー内で、 *composer update を実行して、すべての依存関係をインストール/更新します。
ステップ8 *-拡張機能をインストールする必要があります。 これを使用するには、 *SiteController の actionAbout メソッドの About ビューを変更します。
<?php
/*@var $this yii\web\View*/
use yii\helpers\Html;
$this->title = 'About';
$this->params['breadcrumbs'][] = $this->title;
$this->registerMetaTag(['name' => 'keywords', 'content' => 'yii, developing, views,
meta, tags']);
$this->registerMetaTag(['name' => 'description', 'content' => 'This is the
description of this page!'], 'description');
?>
<div class = "site-about">
<h1><?= Html::encode($this->title) ?></h1>
<p>
This is the About page. You may modify the following file to customize its content:
</p>
<h1><?= HelloWorld\SayHello::world(); ?></h1>
</div>
ステップ9 *-Webブラウザで *http://localhost:8080/index.php?r = site/about と入力します。 拡張機能から hello world メッセージが表示されます。
Yii-HTTPリクエスト
リクエストは yii \ web \ Request オブジェクトで表され、HTTPヘッダー、リクエストパラメータ、Cookieなどに関する情報を提供します。
メソッド* get()および post()*は、要求コンポーネントの要求パラメーターを返します。
例-
$req = Yii::$app->request;
/*
*$get = $_GET;
*/
$get = $req->get();
/*
*if(isset($_GET['id'])) {
* $id = $_GET['id'];
*} else {
* $id = null;
*}
*/
$id = $req->get('id');
/*
*if(isset($_GET['id'])) {
* $id = $_GET['id'];
*} else {
* $id = 1;
*}
*/
$id = $req->get('id', 1);
/*
*$post = $_POST;
*/
$post = $req->post();
/*
*if(isset($_POST['name'])) {
* $name = $_POST['name'];
*} else {
* $name = null;
*}
*/
$name = $req->post('name');
/*
*if(isset($_POST['name'])) {
* $name = $_POST['name'];
*} else {
* $name = '';
*}
*/
$name = $req->post('name', '');
ステップ1 *- *actionTestGet 関数を基本的なアプリケーションテンプレートの SiteController に追加します。
public function actionTestGet() {
var_dump(Yii::$app->request->get());
}
ステップ2 *- *http://localhost:8080/index.php?r = site/testget&id = 1&name = finddevguides&message = welcome に移動すると、次のように表示されます。
- 他のリクエストメソッド(PATCH、DELETEなど)のパラメーターを取得するには、* yii \ web \ Request
- getBodyParam()*メソッドを使用します。
- 現在のリクエストのHTTPメソッドを取得するには、 *Yii
- $ app→request→method* プロパティを使用します。
ステップ3 *-次のコードに示すように、 *actionTestGet 関数を変更します。
public function actionTestGet() {
$req = Yii::$app->request;
if ($req->isAjax) {
echo "the request is AJAX";
}
if ($req->isGet) {
echo "the request is GET";
}
if ($req->isPost) {
echo "the request is POST";
}
if ($req->isPut) {
echo "the request is PUT";
}
}
ステップ4 *- *http://localhost:8080/index.php?r = site/test-get に移動します。 以下が表示されます。
要求コンポーネントは、要求されたURLを検査するための多くのプロパティを提供します。
ステップ5 *-次のように *actionTestGet 関数を変更します。
public function actionTestGet() {
//the URL without the host
var_dump(Yii::$app->request->url);
//the whole URL including the host path
var_dump(Yii::$app->request->absoluteUrl);
//the host of the URL
var_dump(Yii::$app->request->hostInfo);
//the part after the entry script and before the question mark
var_dump(Yii::$app->request->pathInfo);
//the part after the question mark
var_dump(Yii::$app->request->queryString);
//the part after the host and before the entry script
var_dump(Yii::$app->request->baseUrl);
//the URL without path info and query string
var_dump(Yii::$app->request->scriptUrl);
//the host name in the URL
var_dump(Yii::$app->request->serverName);
//the port used by the web server
var_dump(Yii::$app->request->serverPort);
}
ステップ6 *-Webブラウザーのアドレスバーに「 *http://localhost:8080/index.php?r = site/testget&id = 1&name = finddevguides&message = welcome 」と入力すると、次のように表示されます。
- *ステップ7 *-HTTPヘッダー情報を取得するには、 *yii \ web \ Request
- $ headers* プロパティを使用できます。 このように actionTestGet 関数を変更します。
public function actionTestGet() {
var_dump(Yii::$app->request->headers);
}
ステップ8 *-URL *http://localhost:8080/index.php?r = site/testget&id = 1&name = finddevguides&message = welcome にアクセスすると、次のコードに示すような出力が表示されます。
クライアントマシンのホスト名とIPアドレスを取得するには、 userHost および userIP プロパティを使用します。
ステップ9 *- *actionTestGet 関数をこの方法で変更します。
public function actionTestGet() {
var_dump(Yii::$app->request->userHost);
var_dump(Yii::$app->request->userIP);
}
ステップ10 *-アドレス *http://localhost:8080/index.php?r = site/test-get に移動すると、次の画面が表示されます。
Yii-応答
Webアプリケーションが要求を処理するとき、HTTPヘッダー、本文、およびHTTPステータスコードを含む応答オブジェクトを生成します。 ほとんどの場合、応答アプリケーションコンポーネントを使用します。 デフォルトでは、 yii \ web \ Response のインスタンスです。
- 応答HTTPステータスコードを管理するには、 *yii \ web \ Response
- $ statusCode* プロパティを使用します。 yii \ web \ Response :: $ statusCode のデフォルト値は200です。
ステップ1 *- *actionTestResponse という名前の関数を SiteController に追加します。
public function actionTestResponse() {
Yii::$app→response->statusCode = 201;
}
ステップ2 *-Webブラウザで *http://localhost:8080/index.php?r = site/testresponse を指定すると、201 Created response HTTPステータスが表示されます。
あなたが要求が失敗したことを示したい場合は、事前に定義されたHTTP例外のいずれかをスローすることがあります-
- yii \ web \ BadRequestHttpException -ステータスコード400。
- yii \ web \ UnauthorizedHttpException -ステータスコード401。
- yii \ web \ ForbiddenHttpException -ステータスコード403。
- yii \ web \ NotFoundHttpException -ステータスコード404。
- yii \ web \ MethodNotAllowedHttpException -ステータスコード405。
- yii \ web \ NotAcceptableHttpException -ステータスコード406。
- yii \ web \ ConflictHttpException -ステータスコード409。
- yii \ web \ GoneHttpException -ステータスコード410。
- yii \ web \ UnsupportedMediaTypeHttpException -ステータスコード415。
- yii \ web \ TooManyRequestsHttpException -ステータスコード429。
- yii \ web \ ServerErrorHttpException -ステータスコード500。
ステップ3 *-次のコードに示すように、 *actionTestResponse 関数を変更します。
public function actionTestResponse() {
throw new \yii\web\GoneHttpException;
}
ステップ4 *-Webブラウザのアドレスバーに *http://localhost:8080/index.php?r = site/test-response と入力すると、次のように 410 Gone 応答のHTTPステータスが表示されます。次の画像。
ステップ5 *-応答コンポーネントの *headers プロパティを変更することにより、HTTPヘッダーを送信できます。 応答に新しいヘッダーを追加するには、次のコードに示すように actionTestResponse 関数を変更します。
public function actionTestResponse() {
Yii::$app->response->headers->add('Pragma', 'no-cache');
}
ステップ6 *- http://localhost:8080/index.php?r = site/test-responseに移動すると、プラグマヘッダーが表示されます。
Yiiは以下の応答形式をサポートしています-
- HTML -yii \ web \ HtmlResponseFormatterによって実装されています。
- XML -yii \ web \ XmlResponseFormatterによって実装されています。
- JSON -yii \ web \ JsonResponseFormatterによって実装されています。
- JSONP -yii \ web \ JsonResponseFormatterによって実装されています。
- RAW -フォーマットなしの応答。
ステップ7 *- *JSON 形式で応答するには、 actionTestResponse 関数を変更します。
public function actionTestResponse() {
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
return [
'id' => '1',
'name' => 'Ivan',
'age' => 24,
'country' => 'Poland',
'city' => 'Warsaw'
];
}
ステップ8 *-アドレスバーに *http://localhost:8080/index.php?r = site/test-response と入力すると、次の JSON 応答が表示されます。
- YiiはLocation HTTPヘッダーを送信することにより、ブラウザーのリダイレクトを実装します。 * yii \ web \ Response
- redirect()*メソッドを呼び出して、ユーザーのブラウザーをURLにリダイレクトできます。
ステップ9 *- *actionTestResponse 関数をこの方法で変更します。
public function actionTestResponse() {
return $this->redirect('http://www.finddevguides.com/');
}
これで、 http://localhost:8080/index.php?r = site/test-response にアクセスすると、ブラウザーは finddevguides Webサイトにリダイレクトされます。
ファイルを送信する
Yiiはファイル送信をサポートするために次の方法を提供します-
- * yii \ web \ Response :: sendFile()*-既存のファイルを送信します。
- * yii \ web \ Response :: sendStreamAsFile()*-既存のファイルストリームをファイルとして送信します。
- * yii \ web \ Response :: sendContentAsFile()*-テキスト文字列をファイルとして送信します。
このようにactionTestResponse関数を変更します-
public function actionTestResponse() {
return \Yii::$app->response->sendFile('favicon.ico');
}
*http://localhost:8080/index.php?r = site/test-response* と入力すると、 *favicon.ico* ファイルのダウンロードダイアログウィンドウが表示されます-
- 応答は、* yii \ web \ Response
- send()関数が呼び出されるまで送信されません。 デフォルトでは、このメソッドは yii \ base \ Application :: run()メソッドの最後に呼び出されます。 応答を送信するには、 yii \ web \ Response :: send()*メソッドは次の手順に従います-
- * yii \ web \ Response
- EVENT_BEFORE_SENDイベントをトリガーします。
- * yii \ web \ Response
- prepare()メソッドを呼び出します。
- * yii \ web \ Response
- EVENT_AFTER_PREPAREイベントをトリガーします。
- * yii \ web \ Response
- sendHeaders()メソッドを呼び出します。
- * yii \ web \ Response
- sendContent()メソッドを呼び出します。
- * yii \ web \ Response
- EVENT_AFTER_SENDイベントをトリガーします。
Yii-URL形式
Yiiアプリケーションが要求されたURLを処理するとき、最初に、URLを解析してルートにします。 次に、要求を処理するために、このルートを使用して、対応するコントローラーアクションをインスタンス化します。 このプロセスは*ルーティング*と呼ばれます。 逆のプロセスはURL作成と呼ばれます。 urlManager アプリケーションコンポーネントは、ルーティングとURLの作成を担当します。 それは2つの方法を提供します-
- * parseRequest()*-要求をルートに解析します。
- * createUrl()*-指定されたルートからURLを作成します。
URLフォーマット
*urlManager* アプリケーションコンポーネントは2つのURL形式をサポートしています-
*デフォルトの形式では、クエリパラメータ_r_を使用してルートを表します。 たとえば、URL*/index.php?r = news/view&id = 5 *は、ルート *news/view* および *id* クエリパラメーター5を表します。
* プリティURL形式は、エントリスクリプト名に追加のパスを使用します。 たとえば、前の例では、プリティ形式は */index.php/news/view/5* になります。 この形式を使用するには、URLルールを設定する必要があります。
プリティURL形式を有効にし、エントリスクリプト名を非表示にするには、次の手順を実行します-
ステップ1 *-以下の方法で *config/web.php ファイルを変更します。
<?php
$params = require(__DIR__ . '/params.php');
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
//!!! insert a secret key in the following (if it is empty) -
//this is required by cookie validation
'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
//send all mails to a file by default. You have to set
//'useFileTransport' to false and configure a transport
//for the mailer to send real emails.
'useFileTransport' => true,
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'urlManager' => [
'showScriptName' => false,
'enablePrettyUrl' => true
],
'db' => require(__DIR__ . '/db.php'),
],
'modules' => [
'hello' => [
'class' => 'app\modules\hello\Hello',
],
],
'params' => $params,
];
if (YII_ENV_DEV) {
//configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
return $config;
?>
- pretty URL形式*を有効にし、エントリスクリプト名を無効にしました。
ステップ2 *-Webブラウザのアドレスバーに *http://localhost:8080/site/about と入力すると、きれいなURLが実際に表示されます。
URLは http://localhost:8080/index.php?r = site/about ではなくなっていることに注意してください。
Yii-URLルーティング
アプリケーションのデフォルトルートを変更するには、 defaultRoute プロパティを設定する必要があります。
ステップ1 *-以下の方法で *config/web.php ファイルを変更します。
<?php
$params = require(__DIR__ . '/params.php');
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'defaultRoute' => 'site/contact',
'components' => [
//other code
?>
ステップ2 *- *http://localhost:8080/index.php に移動しました。 デフォルトの contact ページが表示されます。
- アプリケーションを一時的にメンテナンスモードにするには、 *yii \ web \ Application
- $ catchAll* プロパティを設定する必要があります。
ステップ3 *-次の関数を *SiteController に追加します。
public function actionMaintenance() {
echo "<h1>Maintenance</h1>";
}
ステップ4 *-次に、次の方法で *config/web.php ファイルを変更します。
<?php
$params = require(__DIR__ . '/params.php');
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'catchAll' => ['site/maintenance'],
'components' => [
//OTHER CODE
- ステップ5 *-アプリケーションのURLを入力すると、次のように表示されます。
URLを作成する
- さまざまな種類のURLを作成するには、* yii \ helpers \ Url
- to()*ヘルパーメソッドを使用できます。 次の例では、デフォルトのURL形式が使用されていると想定しています。
ステップ1 *- actionRoutes()メソッドを *SiteController に追加します。
public function actionRoutes() {
return $this->render('routes');
}
このメソッドは、単に routes ビューをレンダリングします。
ステップ2 *-views/siteディレクトリ内に、次のコードで *routes.php というファイルを作成します。
<?php
use yii\helpers\Url;
?>
<h4>
<b>Url::to(['post/index']):</b>
<?php
//creates a URL to a route:/index.php?r = post/index
echo Url::to(['post/index']);
?>
</h4>
<h4>
<b>Url::to(['post/view', 'id' => 100]):</b>
<?php
//creates a URL to a route with parameters:/index.php?r = post/view&id=100
echo Url::to(['post/view', 'id' => 100]);
?>
</h4>
<h4>
<b>Url::to(['post/view', 'id' => 100, '#' => 'content']):</b>
<?php
//creates an anchored URL:/index.php?r = post/view&id=100#content
echo Url::to(['post/view', 'id' => 100, '#' => 'content']);
?>
</h4>
<h4>
<b>Url::to(['post/index'], true):</b>
<?php
//creates an absolute URL: http://www.example.com/index.php?r=post/index
echo Url::to(['post/index'], true);
?>
</h4>
<h4>
<b>Url::to(['post/index'], 'https'):</b>
<?php
//creates an absolute URL using the https scheme: https://www.example.com/index.php?r=post/index
echo Url::to(['post/index'], 'https');
?>
</h4>
ステップ3 *- *http://localhost:8080/index.php?r = site/routes と入力すると、* to()*関数の使用法がいくつか表示されます。
yii \ helpers \ Url :: to()*メソッドに渡されるルートは、次の規則に従って相対または絶対にすることができます-
ルートが空の場合、現在要求されているルートが使用されます。
ルートに先頭のスラッシュがない場合、現在のモジュールに関連するルートと見なされます。
ルートにスラッシュが含まれていない場合、現在のコントローラーのアクションIDと見なされます。
*yii \ helpers \ Url* ヘルパークラスは、いくつかの便利なメソッドも提供します。
ステップ4 *-次のコードに示すように、 *routes ビューを変更します。
<?php
use yii\helpers\Url;
?>
<h4>
<b>Url::home():</b>
<?php
//home page URL:/index.php?r=site/index
echo Url::home();
?>
</h4>
<h4>
<b>Url::base():</b>
<?php
//the base URL, useful if the application is deployed in a sub-folder of the Web root
echo Url::base();
?>
</h4>
<h4>
<b>Url::canonical():</b>
<?php
//the canonical URL of the currently requested URL
//see https://en.wikipedia.org/wiki/Canonical_link_element
echo Url::canonical();
?>
</h4>
<h4>
<b>Url::previous():</b>
<?php
//remember the currently requested URL and retrieve it back in later requests
Url::remember();
echo Url::previous();
?>
</h4>
ステップ5 *-Webブラウザでアドレス *http://localhost:8080/index.php?r = site/routes を入力すると、次のように表示されます。
Yii-URLのルール
*yii \ web \ UrlRule* の場合、URLルールはインスタンスです。 *urlManager* コンポーネントは、プリティURL形式が有効な場合、 *rules* プロパティで宣言されたURLルールを使用します。
要求を解析するために、URLマネージャーは宣言された順序でルールを取得し、最初のルールを探します。
ステップ1 *- *config/web.php ファイルの urlManager コンポーネントを変更します。
'urlManager' => [
'showScriptName' => false,
'enablePrettyUrl' => true,
'rules' => [
'about' => 'site/about',
]
],
ステップ2 *-Webブラウザの http://localhost:8080/aboutにアクセスします。*ページが表示されます。
URLルールは、このパターンでクエリパラメータに関連付けることができます-
<ParamName:RegExp>、ここで-
- ParamName -パラメーター名
- RegExp -パラメーター値の一致に使用されるオプションの正規表現
、次のURLルールを宣言したとします-
[
'articles/<year:\d{4}>/<category>' => 'article/index',
'articles' => 'article/index',
'article/<id:\d+>' => 'article/view',
]
ルールが*解析*に使用される場合-
- /index.php/articlesはarticle/indexに解析されます */index.php/articles/2014/phpはarticle/indexに解析されます */index.php/article/100はarticle/viewに解析されます */index.php/articles/phpは、articles/phpに解析されます
ルールが* URLの作成*に使用される場合-
- Url :: to(['article/index'])は/index.php/articlesを作成します
- Url :: to(['article/index'、 'year' ⇒ 2014、 'category' ⇒ 'php'])は/index.php/articles/2014/phpを作成します
- Url :: to(['article/view'、 'id' ⇒ 100])は/index.php/article/100を作成します
- Url :: to(['article/view'、 'id' ⇒ 100、 'source' ⇒ 'ad'])は/index.php/article/100?source=adを作成します
- Url :: to(['article/index'、 'category' ⇒ 'php'])は/index.php/article/index?category=phpを作成します
- URLにサフィックスを追加するには、 *yii \ web \ UrlManager
- $ suffix* プロパティを構成する必要があります。
ステップ3 *- *config/web.php ファイルの urlComponent を変更します。
'urlManager' => [
'showScriptName' => false,
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'suffix' => 'l'
],
ステップ4 *-Webブラウザーのアドレスバーにアドレス *http://localhost:8080/site/contactl を入力すると、画面に次のように表示されます。 html サフィックスに注意してください。
Yii-HTMLフォーム
フォームがモデルに基づいている場合、Yiiでこのフォームを作成する一般的な方法は、 yii \ widgets \ ActiveForm クラスを使用することです。 ほとんどの場合、フォームにはデータ検証に使用される対応するモデルがあります。 モデルがデータベースのデータを表す場合、モデルは ActiveRecord クラスから派生する必要があります。 モデルが任意の入力をキャプチャする場合、 yii \ base \ Model クラスから派生する必要があります。
登録フォームを作成しましょう。
ステップ1 *- *models フォルダー内で、 RegistrationForm.php というファイルを次のコードで作成します。
<?php
namespace app\models;
use Yii;
use yii\base\Model;
class RegistrationForm extends Model {
public $username;
public $password;
public $email;
public $subscriptions;
public $photos;
/**
*@return array customized attribute labels
*/
public function attributeLabels() {
return [
'username' => 'Username',
'password' => 'Password',
'email' => 'Email',
'subscriptions' => 'Subscriptions',
'photos' => 'Photos',
];
}
}
?>
ユーザー名、パスワード、電子メール、サブスクリプション、写真の5つのプロパティを持つ登録フォームのモデルを宣言しました。
ステップ2 *-このフォームを表示するには、 *actionRegistration メソッドを SiteController に追加します。
public function actionRegistration() {
$mRegistration = new RegistrationForm();
return $this->render('registration', ['model' => $mRegistration]);
}
*RegistrationForm* のインスタンスを作成し、登録ビューに渡します。 次に、ビューを作成します。
ステップ3 *-views/siteフォルダー内に、次のコードで *registration.php というファイルを追加します。
<?php
use yii\bootstrap\ActiveForm;
use yii\bootstrap\Html;
?>
<div class = "row">
<div class = "col-lg-5">
<?php $form = ActiveForm::begin(['id' => 'registration-form']); ?>
<?= $form->field($model, 'username') ?>
<?= $form->field($model, 'password')->passwordInput() ?>
<?= $form->field($model, 'email')->input('email') ?>
<?= $form->field($model, 'photos[]')->fileInput(['multiple'=>'multiple']) ?>
<?= $form->field($model, 'subscriptions[]')->checkboxList(['a' => 'Item A',
'b' => 'Item B', 'c' => 'Item C']) ?>
<div class = "form-group">
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary',
'name' => 'registration-button']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
</div>
私たちは次のことを観察します-
- * ActiveForm :: begin()関数は、フォームの開始をマークします。 * ActiveForm :: begin()*と ActiveForm :: end()関数の間のすべてのコードは *form タグ内にラップされます。
- フォームにフィールドを作成するには、* ActiveForm :: field()メソッドを呼び出す必要があります。 すべての *inputおよびlabel タグが作成されます。 入力名は自動的に決定されます。
- たとえば、 password 属性は _RegistrationForm [password] _ になります。 属性が配列を取るようにする場合は、属性名に[]を追加する必要があります。
ステップ4 *-Webブラウザーのアドレスバーに移動して *http://localhost:8080/index.php?r = site/registration と入力すると、フォームが表示されます。
Yii-検証
- ユーザーから受け取ったデータを決して信頼しないでください。 ユーザー入力でモデルを検証するには、* yii \ base \ Model
- validate()メソッドを呼び出す必要があります。 検証が成功した場合、ブール値を返します。 エラーがある場合は、 *yii \ base \ Model :: $ errors プロパティからエラーを取得できます。
ルールを使用する
- validate()関数を機能させるには、 yii \ base \ Model :: rules()*メソッドをオーバーライドする必要があります。
ステップ1 *- rules()*メソッドは、次の形式で配列を返します。
[
//required, specifies which attributes should be validated
['attr1', 'attr2', ...],
//required, specifies the type a rule.
'type_of_rule',
//optional, defines in which scenario(s) this rule should be applied
'on' => ['scenario1', 'scenario2', ...],
//optional, defines additional configurations
'property' => 'value', ...
]
ルールごとに、少なくともルールが適用される属性と適用されるルールのタイプを定義する必要があります。
コアの検証ルールは、次のとおりです。 、url。*
ステップ2 *- *models フォルダーに新しいモデルを作成します。
<?php
namespace app\models;
use Yii;
use yii\base\Model;
class RegistrationForm extends Model {
public $username;
public $password;
public $email;
public $country;
public $city;
public $phone;
public function rules() {
return [
//the username, password, email, country, city, and phone attributes are
//required
[[username' ,'password', 'email', 'country', 'city', 'phone'], 'required'],
//the email attribute should be a valid email address
['email', 'email'],
];
}
}
?>
登録フォームのモデルを宣言しました。 モデルには、ユーザー名、パスワード、メール、国、都市、電話の5つのプロパティがあります。 これらはすべて必須であり、メールプロパティは有効なメールアドレスである必要があります。
ステップ3 *- *actionRegistration メソッドを SiteController に追加し、新しい RegistrationForm モデルを作成してビューに渡します。
public function actionRegistration() {
$model = new RegistrationForm();
return $this->render('registration', ['model' => $model]);
}
- ステップ4 *-登録フォームのビューを追加します。 views/siteフォルダー内に、次のコードでregistration.phpというファイルを作成します。
<?php
use yii\bootstrap\ActiveForm;
use yii\bootstrap\Html;
?>
<div class = "row">
<div class = "col-lg-5">
<?php $form = ActiveForm::begin(['id' => 'registration-form']); ?>
<?= $form->field($model, 'username') ?>
<?= $form->field($model, 'password')->passwordInput() ?>
<?= $form->field($model, 'email')->input('email') ?>
<?= $form->field($model, 'country') ?>
<?= $form->field($model, 'city') ?>
<?= $form->field($model, 'phone') ?>
<div class = "form-group">
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary',
'name' => 'registration-button']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
</div>
登録フォームを表示するために ActiveForm ウィジェットを使用しています。
ステップ5 *-ローカルホスト *http://localhost:8080/index.php?r = site/registration に移動して[送信]ボタンをクリックすると、検証ルールが実行されていることがわかります。
ステップ6 *- *username プロパティのエラーメッセージをカスタマイズするには、 RegistrationForm の* rules()*メソッドを次の方法で変更します。
public function rules() {
return [
//the username, password, email, country, city, and phone attributes are required
[[password', 'email', 'country', 'city', 'phone'], 'required'],
['username', 'required', 'message' => 'Username is required'],
//the email attribute should be a valid email address
['email', 'email'],
];
}
ステップ7 *-ローカルホスト *http://localhost:8080/index.php?r = site/registration に移動し、送信ボタンをクリックします。 ユーザー名プロパティのエラーメッセージが変更されていることがわかります。
- ステップ8 *-検証プロセスをカスタマイズするには、これらのメソッドをオーバーライドできます。
- yii \ base \ Model :: beforeValidate():トリガー
- + yii \ base \ Model
- EVENT_BEFORE_VALIDATEイベント。
- yii \ base \ Model :: afterValidate():トリガー
- + yii \ base \ Model
- EVENT_AFTER_VALIDATEイベント。
ステップ9 *-国のプロパティの周りのスペースを切り取り、市のプロパティの空の入力をヌルに変換するには、 *trim および default バリデータを使用します。
public function rules() {
return [
//the username, password, email, country, city, and phone attributes are required
[[password', 'email', 'country', 'city', 'phone'], 'required'],
['username', 'required', 'message' => 'Username is required'],
['country', 'trim'],
['city', 'default'],
//the email attribute should be a valid email address
['email', 'email'],
];
}
- ステップ10 *-入力が空の場合、デフォルト値を設定できます。
public function rules() {
return [
['city', 'default', 'value' => 'Paris'],
];
}
cityプロパティが空の場合、デフォルトの「パリ」値が使用されます。
Yii-アドホック検証
モデルにバインドされていない値を検証する必要がある場合があります。 yii \ base \ DynamicModel クラスを使用できます。このクラスは、属性とルールの両方をオンザフライで定義することをサポートします。
ステップ1 *- *actionAdHocValidation メソッドを SiteController に追加します。
public function actionAdHocValidation() {
$model = DynamicModel::validateData([
'username' => 'John',
'email' => '[email protected]'
], [
[[username', 'email'], 'string', 'max' => 12],
['email', 'email'],
]);
if ($model->hasErrors()) {
var_dump($model->errors);
} else {
echo "success";
}
}
上記のコードでは、ユーザー名と電子メールの属性で*「動的」*モデルを定義し、それらを検証します。
ステップ2 *-Webブラウザのアドレスバーに *http://localhost:8080/index.php?r = site/ad-hoc-validation と入力すると、メールが14文字であるためエラーメッセージが表示されます。長いです。
カスタム検証
カスタムバリデータには2種類あります-
- インラインバリデーター
- スタンドアロンのバリデーター
- インラインバリデータは、モデルメソッドまたは匿名関数によって定義されます。 属性が検証に失敗した場合、* yii \ base \ Model
- addError()*メソッドを呼び出してエラーメッセージを保存する必要があります。
次の RegistrationForm の例は、cityプロパティを検証するため、ロンドンとパリの2つの値のみを受け入れることができます。
<?php
namespace app\models;
use Yii;
use yii\base\Model;
class RegistrationForm extends Model {
public $username;
public $password;
public $email;
public $country;
public $city;
public $phone;
public function rules() {
return [
['city', 'validateCity']
];
}
public function validateCity($attribute, $params) {
if (!in_array($this->$attribute, ['Paris', 'London'])) {
$this->addError($attribute, 'The city must be either "London" or "Paris".');
}
}
}
?>
- スタンドアロンのバリデーターは yii \ validators \ Validator クラスを拡張します。 検証ロジックを実装するには、* yii \ validators \ Validator
- validateAttribute()*メソッドをオーバーライドする必要があります。
ステップ1 *-スタンドアロンのバリデータを使用して前の例を実装するには、 *CityValidator.php ファイルを components フォルダーに追加します。
<?php
namespace app\components;
use yii\validators\Validator;
class CityValidator extends Validator {
public function validateAttribute($model, $attribute) {
if (!in_array($model->$attribute, ['Paris', 'London'])) {
$this->addError($model, $attribute, 'The city must be either "Paris"
or "London".');
}
}
}
?>
ステップ2 *-次に、 *RegistrationForm モデルをこの方法で変更します。
<?php
namespace app\models;
use app\components\CityValidator;
use Yii;
use yii\base\Model;
class RegistrationForm extends Model {
public $username;
public $password;
public $email;
public $country;
public $city;
public $phone;
public function rules() {
return [
['city', CityValidator::className()]
];
}
}
?>
Yii-AJAX検証
サーバーにのみ必要な情報があるため、ユーザー名の検証はサーバー側でのみ行う必要があります。 この場合、AJAXベースの検証を使用できます。
- ステップ1 *-AJAX検証を有効にするには、*登録*ビューをこの方法で変更します。
<?php
use yii\bootstrap\ActiveForm;
use yii\bootstrap\Html;
?>
<div class = "row">
<div class = "col-lg-5">
<?php $form = ActiveForm::begin(['id' => 'registration-form',
'enableAjaxValidation' => true]); ?>
<?= $form->field($model, 'username') ?>
<?= $form->field($model, 'password')->passwordInput() ?>
<?= $form->field($model, 'email')->input('email') ?>
<?= $form->field($model, 'country') ?>
<?= $form->field($model, 'city') ?>
<?= $form->field($model, 'phone') ?>
<div class = "form-group">
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary',
'name' => 'registration-button']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
</div>
また、AJAXリクエストを処理できるようにサーバーを準備する必要があります。
ステップ2 *- *SiteController の actionRegistration メソッドをこの方法で変更します。
public function actionRegistration() {
$model = new RegistrationForm();
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request>post())) {
Yii::$app->response->format = Response::FORMAT_JSON;
return ActiveForm::validate($model);
}
return $this->render('registration', ['model' => $model]);
}
ステップ3 *-ここで、 *http://localhost:8080/index.php?r = site/registration にアクセスすると、フォームの検証がAJAXリクエストによって行われていることがわかります。
Yii-セッション
セッションにより、さまざまなページでデータにアクセスできます。 セッションは、すべてのセッション変数が保存されている一時ディレクトリにサーバー上のファイルを作成します。 このデータは、その特定のユーザーの訪問中にWebサイトのすべてのページで利用できます。
セッションが開始されると、次のことが起こります-
- PHPは、その特定のセッションに対して一意のIDを作成します。
- PHPSESSIDというCookieがクライアント側で(ブラウザーに)送信されます。
- サーバーは、すべてのセッション変数が保存される一時フォルダーにファイルを作成します。
- サーバーがセッション変数から値を取得する場合、PHPはPHPSESSID Cookieから一意のセッションIDを自動的に取得します。 次に、一時ディレクトリで必要なファイルを探します。
セッションを開始するには、* session_start()関数を呼び出す必要があります。 すべてのセッション変数は *$ _ SESSION グローバル変数に保存されます。 また、* isset()*関数を使用して、セッション変数が設定されているかどうかを確認することもできます-
<?php
session_start();
if( isset( $_SESSION['number'] ) ) {
$_SESSION['number'] += 1;
}else {
$_SESSION['number'] = 1;
}
$msg = "This page was visited ". $_SESSION['number'];
$msg .= "in this session.";
echo $msg;
?>
セッションを破棄するには、* session_destroy()関数を呼び出す必要があります。 単一のセッション変数を破棄するには、 unset()*関数を呼び出します-
<?php
unset($_SESSION['number']);
session_destroy();
?>
Yiiでセッションを使用する
セッションにより、ユーザーのリクエスト間でデータを保持できます。 PHPでは、 $ _ SESSION 変数を介してアクセスできます。 Yiiでは、セッションアプリケーションコンポーネントを介してセッションにアクセスできます。
ステップ1 *- *actionOpenAndCloseSession メソッドを SiteController に追加します。
public function actionOpenAndCloseSession() {
$session = Yii::$app->session;
//open a session
$session->open();
//check if a session is already opened
if ($session->isActive) echo "session is active";
//close a session
$session->close();
//destroys all data registered to a session
$session->destroy();
}
上記のコードでは、セッションアプリケーションコンポーネントを取得し、セッションを開いて、アクティブかどうかを確認し、セッションを閉じて、最後に破棄します。
ステップ2 *-Webブラウザのアドレスバーに *http://localhost:8080/index.php?r = site/open-and-close-session と入力すると、次のように表示されます。
セッション変数にアクセスするには、* set()および get()*メソッドを使用できます。
ステップ3 *- *actionAccessSession メソッドを SiteController に追加します。
public function actionAccessSession() {
$session = Yii::$app->session;
//set a session variable
$session->set('language', 'ru-RU');
//get a session variable
$language = $session->get('language');
var_dump($language);
//remove a session variable
$session->remove('language');
//check if a session variable exists
if (!$session->has('language')) echo "language is not set";
$session['captcha'] = [
'value' => 'aSBS23',
'lifetime' => 7200,
];
var_dump($session['captcha']);
}
ステップ4 *- *http://localhost:8080/index.php?r = site/access-session にアクセスすると、次のように表示されます。
Yii-フラッシュデータの使用
Yiiはフラッシュデータの概念を提供します。 フラッシュデータはセッションデータです-
- 1つのリクエストで設定されます。
- 次のリクエストでのみ利用可能になります。
- その後自動的に削除されます。
ステップ1 *- *actionShowFlash メソッドを SiteController に追加します。
public function actionShowFlash() {
$session = Yii::$app->session;
//set a flash message named as "greeting"
$session->setFlash('greeting', 'Hello user!');
return $this->render('showflash');
}
ステップ2 *-views/siteフォルダー内に、 *showflash.php という名前のViewファイルを作成します。
<?php
use yii\bootstrap\Alert;
echo Alert::widget([
'options' => ['class' => 'alert-info'],
'body' => Yii::$app->session->getFlash('greeting'),
]);
?>
ステップ3 *-Webブラウザのアドレスバーに *http://localhost:8080/index.php?r = site/show-flash と入力すると、次のように表示されます。
Yiiはまた、次のセッションクラスを提供します-
- yii \ web \ CacheSession -セッション情報をキャッシュに保存します。
- yii \ web \ DbSession -データベースにセッション情報を保存します。
- yii \ mongodb \ Session -セッション情報をMongoDBに保存します。
- yii \ redis \ Session -redisデータベースを使用してセッション情報を保存します。
Yii-クッキー
Cookieは、クライアント側に保存されるプレーンテキストファイルです。 追跡目的で使用できます。
戻ってくるユーザーを識別するための3つのステップがあります-
- サーバーは一連のCookieをクライアント(ブラウザー)に送信します。 たとえば、IDまたはトークン。
- ブラウザはそれを保存します。
- ブラウザーが次にWebサーバーに要求を送信するときに、ブラウザーはそれらのCookieも送信するため、サーバーはその情報を使用してユーザーを識別できます。
Cookieは通常、次のコードに示すようにHTTPヘッダーに設定されます。
HTTP/1.1 200 OK
Date: Fri, 05 Feb 2015 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name = myname; expires = Monday, 06-Feb-16 22:03:38 GMT;
path =/; domain = finddevguides.com
Connection: close
Content-Type: text/html
PHPは、Cookieを設定する* setcookie()*関数を提供します-
setcookie(name, value, expire, path, domain, security);
ここで-
- name -Cookieの名前を設定し、HTTP_COOKIE_VARSという環境変数に保存されます。
- 値-名前付き変数の値を設定します。
- expiry -1970年1月1日の00:00:00 GMT以降の秒単位で将来の時間を指定します。 この時間が経過すると、Cookieにアクセスできなくなります。
- path -Cookieが有効なディレクトリを指定します。
- domain -これは、非常に大きなドメインでドメイン名を定義するために使用できます。 すべてのCookieは、それらを作成したホストとドメインに対してのみ有効です。
- security -に設定すると、CookieはHTTPSでのみ送信されます。それ以外の場合、0に設定すると、Cookieは通常のHTTPで送信できます。
PHPでCookieにアクセスするには、 $ _ COOKIEまたは$ HTTP_COOKIE_VARS 変数を使用できます。
<?php
echo $_COOKIE["token"]. "<br/>";
/*is equivalent to*/
echo $HTTP_COOKIE_VARS["token"]. "<br/>";
echo $_COOKIE["id"] . "<br/>";
/*is equivalent to*/
echo $HTTP_COOKIE_VARS["id"] . "<br/>";
?>
Cookieを削除するには、Cookieの有効期限が既に切れている日付を設定する必要があります。
<?php
setcookie( "token", "", time()- 60, "/","", 0);
setcookie( "id", "", time()- 60, "/","", 0);
?>
Yii-クッキーの使用
Cookieを使用すると、リクエスト間でデータを保持できます。 PHPでは、 $ _ COOKIE 変数を介してアクセスできます。 YiiはCookieを yii \ web \ Cookie クラスのオブジェクトとして表します。 この章では、Cookieを読み取るためのいくつかの方法について説明します。
ステップ1 *- *SiteController で actionReadCookies メソッドを作成します。
public function actionReadCookies() {
//get cookies from the "request" component
$cookies = Yii::$app->request->cookies;
//get the "language" cookie value
//if the cookie does not exist, return "ru" as the default value
$language = $cookies->getValue('language', 'ru');
//an alternative way of getting the "language" cookie value
if (($cookie = $cookies->get('language')) !== null) {
$language = $cookie->value;
}
//you may also use $cookies like an array
if (isset($cookies['language'])) {
$language = $cookies['language']->value;
}
//check if there is a "language" cookie
if ($cookies->has('language')) echo "Current language: $language";
}
ステップ2 *-Cookieの送信動作を確認するには、 *SiteController で actionSendCookies というメソッドを作成します。
public function actionSendCookies() {
//get cookies from the "response" component
$cookies = Yii::$app->response->cookies;
//add a new cookie to the response to be sent
$cookies->add(new \yii\web\Cookie([
'name' => 'language',
'value' => 'ru-RU',
]));
$cookies->add(new \yii\web\Cookie([
'name' => 'username',
'value' => 'John',
]));
$cookies->add(new \yii\web\Cookie([
'name' => 'country',
'value' => 'USA',
]));
}
ステップ3 *- *http://localhost:8080/index.php?r = site/send-cookies にアクセスすると、Cookieがブラウザー内に保存されていることがわかります。
Yiiでは、デフォルトでCookie検証が有効になっています。 Cookieがクライアント側で変更されるのを防ぎます。 config/web.phpファイルのハッシュ文字列は、各Cookieに署名します。
<?php
$params = require(__DIR__ . '/params.php');
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
//!!! insert a secret key in the following (if it is empty) - this is
//required by cookie validation
'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
//send all mails to a file by default. You have to set
//'useFileTransport' to false and configure a transport
//for the mailer to send real emails.
'useFileTransport' => true,
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'urlManager' => [
//'showScriptName' => false,
//'enablePrettyUrl' => true,
//'enableStrictParsing' => true,
//'suffix' => '/'
],
'db' => require(__DIR__ . '/db.php'),
],
'modules' => [
'hello' => [
'class' => 'app\modules\hello\Hello',
],
],
'params' => $params,
];
if (YII_ENV_DEV) {
//configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
return $config;
?>
- *yii \ web \ Request
- $ enableCookieValidation* プロパティを false に設定すると、Cookie検証を無効にできます。
Yii-ファイルのアップロード
*yii \ web \ UploadedFile、models* 、および *yii \ widgets \ ActiveForm* を使用して、ファイルアップロード機能を簡単に実装できます。
ルートフォルダーにディレクトリ「アップロード」を作成します。 このディレクトリには、アップロードされたすべての画像が保持されます。 単一のファイルをアップロードするには、アップロードされたファイルインスタンスのモデルとモデルの属性を作成する必要があります。 ファイルのアップロードも検証する必要があります。
ステップ1 *- *models フォルダー内に、次の内容の UploadImageForm.php というファイルを作成します。
<?php
namespace app\models;
use yii\base\Model;
class UploadImageForm extends Model {
public $image;
public function rules() {
return [
[[image'], 'file', 'skipOnEmpty' => false, 'extensions' => 'jpg, png'],
];
}
public function upload() {
if ($this->validate()) {
$this->image->saveAs('../uploads/' . $this->image->baseName . '.' .
$this->image->extension);
return true;
} else {
return false;
}
}
}
?>
*image* 属性は、ファイルインスタンスを保持するために使用されます。 *file* 検証ルールは、ファイルの拡張子が *png* または *jpg* であることを確認します。 _upload_関数はファイルを検証し、サーバーに保存します。
ステップ2 *-次に、 *actionUploadImage 関数を SiteController に追加します。
public function actionUploadImage() {
$model = new UploadImageForm();
if (Yii::$app->request->isPost) {
$model->image = UploadedFile::getInstance($model, 'image');
if ($model->upload()) {
//file is uploaded successfully
echo "File successfully uploaded";
return;
}
}
return $this->render('upload', ['model' => $model]);
}
- ステップ3 *-フォームが送信されると、 yii \ web \ UploadedFile
- getInstance()関数を呼び出して、アップロードされたファイルを *UploadedFile インスタンスとして表します。 次に、ファイルを検証し、サーバーに保存します。
ステップ4 *-次に、 *views/site ディレクトリ内に upload.php ビューファイルを作成します。
<?php
use yii\widgets\ActiveForm;
?>
<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']])?>
<?= $form->field($model, 'image')->fileInput() ?>
<button>Submit</button>
<?php ActiveForm::end() ?>
ファイルをアップロードするときは、必ず enctype オプションを追加してください。 * fileInput()*メソッドは、次のhtmlコードをレンダリングします−
<input type = "file">
上記のHTMLコードにより、ユーザーはファイルを選択してアップロードできます。
ステップ5 *- *http://localhost:8080/index.php?r = site/upload-image にアクセスすると、次のように表示されます。
ステップ6 *-アップロードする画像を選択して、[送信]ボタンをクリックします。 ファイルは、サーバーの *'uploads' フォルダー内に保存されます。
Yii-フォーマット
データを読み取り可能な形式で表示するには、 formatter アプリケーションコンポーネントを使用できます。
*Step1* - *actionFormatter* メソッドを *SiteController* に追加します。
public function actionFormatter(){
return $this->render('formatter');
}
上記のコードでは、 formatter ビューをレンダリングするだけです。
ステップ2 *-次に、 views/siteフォルダー内に formatter.php ビューファイルを作成します。
<?php
$formatter = \Yii::$app->formatter;
//output: January 1, 2016
echo $formatter->asDate('2016-01-01', 'long'),"<br>";
//output: 51.50%
echo $formatter->asPercent(0.515, 2),"<br>";
//output: <a href = "mailto:[email protected]">[email protected]</a>
echo $formatter->asEmail('[email protected]'),"<br>";
//output: Yes
echo $formatter->asBoolean(true),"<br>";
//output: (Not set)
echo $formatter->asDate(null),"<br>";
?>
ステップ3 *- *http://localhost:8080/index.php?r = site/formatter に移動すると、次の出力が表示されます。
- フォーマッタ*コンポーネントは、日付と時刻に関連する次の形式をサポートしています-
Output format | Example |
---|---|
date | January 01, 2016 |
time | 16:06 |
datetime | January 01, 2016 16:06 |
timestamp | 1512609983 |
relativeTime | 1 hour ago |
duration | 5 minutes |
ステップ4 *-このように *formatter ビューを変更します。
<?php
$formatter = \Yii::$app->formatter;
echo $formatter->asDate(date('Y-m-d'), 'long'),"<br>";
echo $formatter->asTime(date("Y-m-d")),"<br>";
echo $formatter->asDatetime(date("Y-m-d")),"<br>";
echo $formatter->asTimestamp(date("Y-m-d")),"<br>";
echo $formatter->asRelativeTime(date("Y-m-d")),"<br>";
?>
ステップ5 *-Webブラウザのアドレスバーに *http://localhost:8080/index.php?r = site/formatter と入力すると、次の出力が表示されます。
日付の形式
また、4つの日付形式のショートカットがあります: short、medium、long、およびfull 。
ステップ1 *-このように *formatter ビューファイルを変更します。
<?php
$formatter = \Yii::$app->formatter;
echo $formatter->asDate(date('Y-m-d'), 'short'),"<br>";
echo $formatter->asDate(date('Y-m-d'), 'medium'),"<br>";
echo $formatter->asDate(date('Y-m-d'), 'long'),"<br>";
echo $formatter->asDate(date('Y-m-d'), 'full'),"<br>";
?>
ステップ2 *-Webブラウザーに移動して *http://localhost:8080/index.php?r = site/formatter と入力すると、次の出力が表示されます。
数値形式
- フォーマッタ*コンポーネントは、数字に関連する次の形式をサポートしています-
Output format | Example |
---|---|
integer | 51 |
decimal | 105.51 |
percent | 51% |
scientific | 1.050000E+2 |
currency | $105 |
size | 105 bytes |
shortSize | 105 B |
ステップ1 *-このように *formatter ビューを変更します。
<?php
$formatter = \Yii::$app->formatter;
echo Yii::$app->formatter->asInteger(105),"<br>";
echo Yii::$app->formatter->asDecimal(105.41),"<br>";
echo Yii::$app->formatter->asPercent(0.51),"<br>";
echo Yii::$app->formatter->asScientific(105),"<br>";
echo Yii::$app->formatter->asCurrency(105, "$"),"<br>";
echo Yii::$app->formatter->asSize(105),"<br>";
echo Yii::$app->formatter->asShortSize(105),"<br>";
?>
ステップ2 *- *http://localhost:8080/index.php?r = site/formatter にアクセスすると、次の出力が表示されます。
その他の形式
Yiiは他の形式もサポートしています-
- text -値はHTMLエンコードされています。
- raw -値はそのまま出力されます。
- paragraphs -値は_p_タグにラップされたHTMLテキスト段落としてフォーマットされます。
- ntext -値は、改行が改行に変換されるHTMLプレーンテキストとしてフォーマットされます。
- html -XSS攻撃を回避するために、HtmlPurifierを使用して値が精製されます。
- image -値は画像タグとしてフォーマットされます。
- boolean -値はブール値としてフォーマットされます。
- url -値はリンクとしてフォーマットされます。
- email -値はmailto-linkとしてフォーマットされます。
フォーマッタは、現在アクティブなロケールを使用して、特定の国の値をフォーマットする方法を決定できます。
次の例は、さまざまなロケールの日付をフォーマットする方法を示しています。
<?php
Yii::$app->formatter->locale = 'ru-RU';
echo Yii::$app->formatter->asDate('2016-01-01');//output: 1 января 2016 г.
Yii::$app->formatter->locale = 'de-DE';
//output: 1. Januar 2016
echo Yii::$app->formatter->asDate('2016-01-01');
Yii::$app->formatter->locale = 'en-US';
//output: January 1, 2016
echo Yii::$app->formatter->asDate('2016-01-01');
?>
Yii-ページネーション
1つのページに表示するにはデータが多すぎる場合は、複数のページに表示する必要があります。 これはページネーションとも呼ばれます。
ページネーションの動作を示すには、データが必要です。
DBの準備
- ステップ1 *-新しいデータベースを作成します。 データベースは、次の2つの方法で準備できます。
- ターミナルで_mysql -u root -p_を実行します
- _CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci; _を介して新しいデータベースを作成します
ステップ2 *- *config/db.php ファイルでデータベース接続を設定します。 次の構成は、現在使用されているシステム用です。
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host = localhost;dbname = helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
];
?>
ステップ3 *-ルートフォルダー内で./yii migrate/create test_table *を実行します。 このコマンドは、DBを管理するためのデータベース移行を作成します。 移行ファイルは、プロジェクトルートの *migrations フォルダーに表示されます。
ステップ4 *-この方法で移行ファイル(この場合は *m160106_163154_test_table.php )を変更します。
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160106_163154_test_table extends Migration {
public function safeUp() {
$this->createTable("user", [
"id" => Schema::TYPE_PK,
"name" => Schema::TYPE_STRING,
"email" => Schema::TYPE_STRING,
]);
$this->batchInsert("user", ["name", "email"], [
["User1", "[email protected]"],
["User2", "[email protected]"],
["User3", "[email protected]"],
["User4", "[email protected]"],
["User5", "[email protected]"],
["User6", "[email protected]"],
["User7", "[email protected]"],
["User8", "[email protected]"],
["User9", "[email protected]"],
["User10", "[email protected]"],
["User11", "[email protected]"],
]);
}
public function safeDown() {
$this->dropTable('user');
}
}
?>
上記の移行では、id、name、およびemailのフィールドを持つ user テーブルが作成されます。 また、いくつかのデモユーザーを追加します。
- ステップ5 *-プロジェクトのルート内で./yii migrate *を実行して、データベースに移行を適用します。
ステップ6 *-次に、 *user テーブルのモデルを作成する必要があります。 簡単にするために、 Gii コード生成ツールを使用します。 この url:http://localhost:8080/index.php?r = gii を開きます。 次に、「Model generator」ヘッダーの下にある「Start」ボタンをクリックします。 テーブル名(「ユーザー」)とモデルクラス(「MyUser」)を入力し、「プレビュー」ボタンをクリックして、最後に「生成」ボタンをクリックします。
*MyUser* モデルがモデルディレクトリに表示されます。
アクションのページネーション
ステップ1 *- *actionPagination メソッドを SiteController に追加します。
public function actionPagination() {
//preparing the query
$query = MyUser::find();
//get the total number of users
$count = $query->count();
//creating the pagination object
$pagination = new Pagination(['totalCount' => $count, 'defaultPageSize' => 10]);
//limit the query using the pagination and retrieve the users
$models = $query->offset($pagination->offset)
->limit($pagination->limit)
->all();
return $this->render('pagination', [
'models' => $models,
'pagination' => $pagination,
]);
}
ステップ2 *- *views/site フォルダー内に pagination.php というビューファイルを作成します。
<?php
use yii\widgets\LinkPager;
?>
<?php foreach ($models as $model): ?>
<?= $model->id; ?>
<?= $model->name; ?>
<?= $model->email; ?>
<br/>
<?php endforeach; ?>
<?php
//display pagination
echo LinkPager::widget([
'pagination' => $pagination,
]);
?>
今、Webブラウザを介してローカルホスト http://localhost:8080/index.php?r = site/pagination にアクセスすると、ページネーションウィジェットが表示されます-
Yii-ソート
大量のデータを表示する場合、多くの場合、データを並べ替える必要があります。 Yiiは* yii \ data \ Sortオブジェクト*を使用してソートスキーマを表します。
並べ替えの動作を示すには、データが必要です。
DBの準備
- ステップ1 *-新しいデータベースを作成します。 データベースは、次の2つの方法で準備できます。
- ターミナルで_mysql -u root –p_を実行します
- _CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci; _を介して新しいデータベースを作成します
ステップ2 *- *config/db.php ファイルでデータベース接続を設定します。 次の構成は、現在使用されているシステム用です。
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
];
?>
ステップ3 *-ルートフォルダー内で./yii migrate/create test_table *を実行します。 このコマンドは、DBを管理するためのデータベース移行を作成します。 移行ファイルは、プロジェクトルートの *migrations フォルダーに表示されます。
ステップ4 *-この方法で移行ファイル(この場合は *m160106_163154_test_table.php )を変更します。
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160106_163154_test_table extends Migration {
public function safeUp() {
$this->createTable("user", [
"id" => Schema::TYPE_PK,
"name" => Schema::TYPE_STRING,
"email" => Schema::TYPE_STRING,
]);
$this->batchInsert("user", ["name", "email"], [
["User1", "[email protected]"],
["User2", "[email protected]"],
["User3", "[email protected]"],
["User4", "[email protected]"],
["User5", "[email protected]"],
["User6", "[email protected]"],
["User7", "[email protected]"],
["User8", "[email protected]"],
["User9", "[email protected]"],
["User10", "[email protected]"],
["User11", "[email protected]"],
]);
}
public function safeDown() {
$this->dropTable('user');
}
}
?>
上記の移行では、id、name、およびemailのフィールドを持つ user テーブルが作成されます。 また、いくつかのデモユーザーを追加します。
- ステップ5 *-プロジェクトのルート内で./yii migrate *を実行して、データベースに移行を適用します。
ステップ6 *-次に、 *user テーブルのモデルを作成する必要があります。 簡単にするために、 Gii コード生成ツールを使用します。 この url:http://localhost:8080/index.php?r = gii を開きます。 次に、「Model generator」ヘッダーの下にある「Start」ボタンをクリックします。 テーブル名(「ユーザー」)とモデルクラス(「MyUser」)を入力し、「プレビュー」ボタンをクリックして、最後に「生成」ボタンをクリックします。
MyUserモデルがモデルディレクトリに表示されます。
アクションでの並べ替え
ステップ1 *- *actionSorting メソッドを SiteController に追加します。
public function actionSorting() {
//declaring the sort object
$sort = new Sort([
'attributes' => ['id', 'name', 'email'],
]);
//retrieving all users
$models = MyUser::find()
->orderBy($sort->orders)
->all();
return $this->render('sorting', [
'models' => $models,
'sort' => $sort,
]);
}
ステップ2 *-views/siteフォルダー内で *sort 内に sort という View ファイルを作成します。
<?php
//display links leading to sort actions
echo $sort->link('id') . ' | ' . $sort->link('name') . ' | ' . $sort->link('email');
?><br/>
<?php foreach ($models as $model): ?>
<?= $model->id; ?>
<?= $model->name; ?>
<?= $model->email; ?>
<br/>
<?php endforeach; ?>
ステップ3 *-Webブラウザで *http://localhost:8080/index.php?r = site/sorting と入力すると、id、name、およびemailフィールドが次のようにソート可能であることがわかります。次の画像で。
Yii-プロパティ
PHPのクラスメンバー変数は、 properties とも呼ばれます。 これらはクラスインスタンスの状態を表します。 Yiiは yii \ base \ Object というクラスを導入します。 getter または setter クラスメソッドによるプロパティの定義をサポートします。
getterメソッドは、 get という単語で始まります。 セッターメソッドは set で始まります。 クラスメンバー変数のようなゲッターとセッターによって定義されたプロパティを使用できます。
プロパティが読み取られると、getterメソッドが呼び出されます。 プロパティが割り当てられると、setterメソッドが呼び出されます。 セッターが定義されていない場合、ゲッターによって定義されたプロパティは*読み取り専用*です。
ステップ1 *-componentsフォルダー内に *Taxi.php というファイルを作成します。
<?php
namespace app\components;
use yii\base\Object;
class Taxi extends Object {
private $_phone;
public function getPhone() {
return $this->_phone;
}
public function setPhone($value) {
$this->_phone = trim($value);
}
}
?>
上記のコードでは、Objectクラスから派生したTaxiクラスを定義しています。 ゲッター-* getPhone()およびセッター- setPhone()*を設定します。
ステップ2 *-*今、 actionProperties メソッドを SiteController に追加します。
public function actionProperties() {
$object = new Taxi();
//equivalent to $phone = $object->getPhone();
$phone = $object->phone;
var_dump($phone);
//equivalent to $object->setLabel('abc');
$object->phone = '79005448877';
var_dump($object);
}
上記の関数では、Taxiオブジェクトを作成し、ゲッター経由で phone プロパティにアクセスし、セッター経由で phone プロパティを設定しようとしました。
ステップ3 *-Webブラウザで、アドレスバーに *http://localhost:8080/index.php?r = site/properties と入力すると、次の出力が表示されます。
Yii-データプロバイダー
Yiiは、ページネーションとソートをカプセル化するデータプロバイダークラスのセットを提供します。 データプロバイダーはyii \ data \ DataProviderInterfaceを実装します。 ソートおよびページ分割されたデータの取得をサポートします。 通常、データプロバイダーはデータウィジェットを使用します。
Yiiには-
- ActiveDataProvider - yii \ db \ ActiveQuery または yii \ db \ Query を使用して、データベースからデータをクエリします。
- SqlDataProvider -SQLを実行し、配列としてデータを返します。
- ArrayDataProvider -大きな配列を受け取り、そのスライスを返します。
データプロバイダーの pagination および sort プロパティを構成することで、データプロバイダーの並べ替えとページネーションの動作を定義します。 yii \ grid \ GridView などのデータウィジェットには、 dataProvider というプロパティがあります。このプロパティは、データプロバイダーインスタンスを取得し、画面にデータを表示します。
DBの準備
- ステップ1 *-新しいデータベースを作成します。 データベースは、次の2つの方法で準備できます。
- ターミナルで_mysql -u root –p_を実行します。
- CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ciで新しいデータベースを作成します。
ステップ2 *- *config/db.php ファイルでデータベース接続を設定します。 次の構成は、現在使用されているシステム用です。
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host = localhost;dbname = helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
];
?>
ステップ3 *-ルートフォルダー内で./yii migrate/create test_table *を実行します。 このコマンドは、DBを管理するためのデータベース移行を作成します。 移行ファイルは、プロジェクトルートの *migrations フォルダーに表示されます。
ステップ4 *-この方法で移行ファイル(この場合は *m160106_163154_test_table.php )を変更します。
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160106_163154_test_table extends Migration {
public function safeUp() {
$this->createTable("user", [
"id" => Schema::TYPE_PK,
"name" => Schema::TYPE_STRING,
"email" => Schema::TYPE_STRING,
]);
$this->batchInsert("user", ["name", "email"], [
["User1", "[email protected]"],
["User2", "[email protected]"],
["User3", "[email protected]"],
["User4", "[email protected]"],
["User5", "[email protected]"],
["User6", "[email protected]"],
["User7", "[email protected]"],
["User8", "[email protected]"],
["User9", "[email protected]"],
["User10", "[email protected]"],
["User11", "[email protected]"],
]);
}
public function safeDown() {
$this->dropTable('user');
}
}
?>
上記の移行では、id、name、およびemailのフィールドを持つ user テーブルが作成されます。 また、いくつかのデモユーザーを追加します。
- ステップ5 *-プロジェクトのルート内で./yii migrate *を実行して、データベースに移行を適用します。
ステップ6 *-次に、 *user テーブルのモデルを作成する必要があります。 簡単にするために、 Gii コード生成ツールを使用します。 この url:http://localhost:8080/index.php?r = gii を開きます。 次に、「Model generator」ヘッダーの下にある「Start」ボタンをクリックします。 テーブル名(「ユーザー」)とモデルクラス(「MyUser」)を入力し、「プレビュー」ボタンをクリックして、最後に「生成」ボタンをクリックします。
MyUserモデルがモデルディレクトリに表示されます。
アクティブデータプロバイダー
ステップ1 *- *SiteController 内に actionDataProvider という関数を作成します。
public function actionDataProvider(){
$query = MyUser::find();
$provider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 2,
],
]);
//returns an array of users objects
$users = $provider->getModels();
var_dump($users);
}
上記のコードでは、 ActiveDataProvider クラスのインスタンスを定義し、最初のページからユーザーを表示します。 yii \ data \ ActiveDataProvider クラスは、DBアプリケーションコンポーネントをDB接続として使用します。
ステップ2 *-ローカルホストアドレス *http://localhost:8080/index.php?r = site/dataprovider を入力すると、次の出力が表示されます。
SQLデータプロバイダー
*yii \ data \ SqlDataProvider* クラスは、生のSQLステートメントで機能します。
ステップ1 *-この方法で *actionDataProvider メソッドを変更します。
public function actionDataProvider() {
$count = Yii::$app->db->createCommand('SELECT COUNT(*) FROM user')->queryScalar();
$provider = new SqlDataProvider([
'sql' => 'SELECT * FROM user',
'totalCount' => $count,
'pagination' => [
'pageSize' => 5,
],
'sort' => [
'attributes' => [
'id',
'name',
'email',
],
],
]);
//returns an array of data rows
$users = $provider->getModels();
var_dump($users);
}
ステップ2 *-Webブラウザーのアドレスバーに *http://localhost:8080/index.php?r = site/data-provider と入力すると、次の出力が表示されます。
配列データプロバイダー
*yii \ data \ ArrayDataProvider* クラスは、大きな配列を扱うのに最適です。 この配列の要素は、DAOのクエリ結果またはActive Recordインスタンスのいずれかです。
ステップ1 *-この方法で *actionDataProvider メソッドを変更します。
public function actionDataProvider() {
$data = MyUser::find()->asArray()->all();
$provider = new ArrayDataProvider([
'allModels' => $data,
'pagination' => [
'pageSize' => 3,
],
'sort' => [
'attributes' => ['id', 'name'],
],
]);
//get the rows in the currently requested page
$users = $provider->getModels();
var_dump($users);
}
ステップ2 *-Webブラウザからアドレス *http://localhost:8080/index.php?r = site/data-provider にアクセスすると、次の出力が表示されます。
SQLデータプロバイダーやアクティブデータプロバイダーとは異なり、配列データプロバイダーはすべてのデータをメモリにロードするため、効率が低いことに注意してください。
Yii-データウィジェット
Yiiは、データを表示するための一連のウィジェットを提供します。 DetailViewウィジェットを使用して、単一のレコードを表示できます。 ListViewウィジェットとグリッドビューを使用して、フィルタリング、並べ替え、ページネーションなどの機能を備えたレコードのテーブルを表示できます。
DBの準備
- ステップ1 *-新しいデータベースを作成します。 データベースは、次の2つの方法で準備できます。
- ターミナルで_mysql -u root –p_を実行します
- CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;を介して新しいデータベースを作成します。
ステップ2 *- *config/db.php ファイルでデータベース接続を設定します。 次の構成は、現在使用されているシステム用です。
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
];
?>
ステップ3 *-ルートフォルダー内 *run。/yii migrate/create test_table 。 このコマンドは、DBを管理するためのデータベース移行を作成します。 移行ファイルは、プロジェクトルートの migrations フォルダーに表示されます。
ステップ4 *-この方法で移行ファイル(この場合は *m160106_163154_test_table.php )を変更します。
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160106_163154_test_table extends Migration {
public function safeUp() {
$this->createTable("user", [
"id" => Schema::TYPE_PK,
"name" => Schema::TYPE_STRING,
"email" => Schema::TYPE_STRING,
]);
$this->batchInsert("user", ["name", "email"], [
["User1", "[email protected]"],
["User2", "[email protected]"],
["User3", "[email protected]"],
["User4", "[email protected]"],
["User5", "[email protected]"],
["User6", "[email protected]"],
["User7", "[email protected]"],
["User8", "[email protected]"],
["User9", "[email protected]"],
["User10", "[email protected]"],
["User11", "[email protected]"],
]);
}
public function safeDown() {
$this->dropTable('user');
}
}
?>
上記の移行では、id、name、およびemailのフィールドを持つ user テーブルが作成されます。 また、いくつかのデモユーザーを追加します。
ステップ5 *-プロジェクトルート *run。/yii migrate 内で、データベースに移行を適用します。
ステップ6 *-次に、 *user テーブルのモデルを作成する必要があります。 簡単にするために、 Gii コード生成ツールを使用します。 この url:http://localhost:8080/index.php?r = gii を開きます。 次に、「Model generator」ヘッダーの下にある「Start」ボタンをクリックします。 テーブル名(「ユーザー」)とモデルクラス(「MyUser」)を入力し、「プレビュー」ボタンをクリックして、最後に「生成」ボタンをクリックします。
MyUserモデルがモデルディレクトリに表示されます。
DetailViewウィジェット
- DetailViewウィジェット*は、単一のモデルのデータを表示します。 $ attributes プロパティは、表示するモデル属性を定義します。
ステップ1 *- *actionDataWidget メソッドを SiteController に追加します。
public function actionDataWidget() {
$model = MyUser::find()->one();
return $this->render('datawidget', [
'model' => $model
]);
}
上記のコードでは、最初のMyUserモデルを見つけ、それを datawidget ビューに渡します。
ステップ2 *- *views/site フォルダー内に datawidget.php というファイルを作成します。
<?php
use yii\widgets\DetailView;
echo DetailView::widget([
'model' => $model,
'attributes' => [
'id',
//formatted as html
'name:html',
[
'label' => 'e-mail',
'value' => $model->email,
],
],
]);
?>
ステップ3 *- *http://localhost:8080/index.php?r = site/data-widget にアクセスすると、 DetailView ウィジェットの一般的な使用方法が表示されます。
Yii-ListViewウィジェット
ListViewウィジェットは、データプロバイダーを使用してデータを表示します。 各モデルは、指定されたビューファイルを使用してレンダリングされます。
ステップ1 *-この方法で actionDataWidget()*メソッドを変更します。
public function actionDataWidget() {
$dataProvider = new ActiveDataProvider([
'query' => MyUser::find(),
'pagination' => [
'pageSize' => 20,
],
]);
return $this->render('datawidget', [
'dataProvider' => $dataProvider
]);
}
上記のコードでは、データプロバイダーを作成し、それをdatawidgetビューに渡します。
- ステップ2 *-この方法でdatawidgetビューファイルを変更します。
<?php
use yii\widgets\ListView;
echo ListView::widget([
'dataProvider' => $dataProvider,
'itemView' => '_user',
]);
?>
ListViewウィジェットをレンダリングします。 各モデルは__user_ビューでレンダリングされます。
ステップ3 *- *views/site フォルダー内に _user.php というファイルを作成します。
<?php
use yii\helpers\Html;
use yii\helpers\HtmlPurifier;
?>
<div class = "user">
<?= $model->id ?>
<?= Html::encode($model->name) ?>
<?= HtmlPurifier::process($model->email) ?>
</div>
ステップ4 *-Webブラウザのアドレスバーに *http://localhost:8080/index.php?r = site/data-widget と入力すると、次のように表示されます。
Yii-GridViewウィジェット
GridViewウィジェットは、データプロバイダーからデータを取得し、データを表形式で表示します。 表の各行は単一のデータ項目を表し、列は項目の属性を表します。
ステップ1 *-この方法で *datawidget ビューを変更します。
<?php
use yii\grid\GridView;
echo GridView::widget([
'dataProvider' => $dataProvider,
]);
?>
ステップ2 *- *http://localhost:8080/index.php?r = site/data-widget に移動すると、DataGridウィジェットの一般的な使用方法が表示されます。
DataGridウィジェットの列は、 yii \ grid \ Column クラスの観点から構成されます。 モデル属性を表し、フィルターおよびソートできます。
ステップ3 *-カスタム列をグリッドに追加するには、 *datawidget ビューをこの方法で変更します。
<?php
yii\grid\GridView;
echo GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'id',
[
'class' => 'yii\grid\DataColumn',//can be omitted, as it is the default
'label' => 'Name and email',
'value' => function ($data) {
return $data->name . " writes from " . $data->email;
},
],
],
]);
?>
ステップ4 *-アドレス *http://localhost:8080/index.php?r = site/data-widget にアクセスすると、次の画像のように出力が表示されます。
グリッド列は、yii \ grid \ SerialColumn、yii \ grid \ ActionColumn、yii \ grid \ CheckboxColumnなどのさまざまな列クラスを使用してカスタマイズできます。
ステップ5 *-次の方法で *datawidget ビューを変更します。
<?php
use yii\grid\GridView;
echo GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
['class' => 'yii\grid\SerialColumn'], 'name',
['class' => 'yii\grid\ActionColumn'],
['class' => 'yii\grid\CheckboxColumn'],
],
]);
?>
ステップ6 *- *http://localhost:8080/index.php?r = site/data-widget に移動すると、次のように表示されます。
Yii-イベント
*events* を使用して、特定の実行ポイントでカスタムコードを挿入できます。 イベントにカスタムコードを添付できます。イベントがトリガーされると、コードが実行されます。 たとえば、新しいユーザーがWebサイトに登録すると、ロガーオブジェクトが *userRegistered* イベントをトリガーする場合があります。 クラスがイベントをトリガーする必要がある場合は、yii \ base \ Componentクラスから拡張する必要があります。
イベントハンドラはPHPコールバックです。 次のコールバックを使用できます-
- 文字列として指定されたグローバルPHP関数。
- 匿名関数。
- ['ClassName'、 'methodName']など、文字列としてのクラス名とメソッドの配列
- 文字列としてのオブジェクトとメソッドの配列。たとえば、[$ obj、 'methodName']
- ステップ1 *-ハンドラーをイベントにアタッチするには、 yii \ base \ Component
- on()*メソッドを呼び出す必要があります。
$obj = new Obj;
//this handler is a global function
$obj->on(Obj::EVENT_HELLO, 'function_name');
//this handler is an object method
$obj->on(Obj::EVENT_HELLO, [$object, 'methodName']);
//this handler is a static class method
$obj->on(Obj::EVENT_HELLO, ['app\components\MyComponent', 'methodName']);
//this handler is an anonymous function
$obj->on(Obj::EVENT_HELLO, function ($event) {
//event handling logic
});
1つ以上のハンドラーをイベントに添付できます。 アタッチされたハンドラーは、イベントにアタッチされた順に呼び出されます。
- ステップ2 *-ハンドラーの呼び出しを停止するには、 yii \ base \ Event
- $ handledプロパティ*を true に設定する必要があります。
$obj->on(Obj::EVENT_HELLO, function ($event) {
$event->handled = true;
});
- ステップ3 *-ハンドラーをキューの先頭に挿入するには、 yii \ base \ Component
- on()*を呼び出して、4番目のパラメーターにfalseを渡します。
$obj->on(Obj::EVENT_HELLO, function ($event) {
//...
}, $data, false);
- ステップ4 *-イベントをトリガーするには、 yii \ base \ Component
- trigger()*メソッドを呼び出します。
namespace app\components;
use yii\base\Component;
use yii\base\Event;
class Obj extends Component {
const EVENT_HELLO = 'hello';
public function triggerEvent() {
$this->trigger(self::EVENT_HELLO);
}
}
- ステップ5 *-ハンドラーをイベントから切り離すには、 yii \ base \ Component
- off()*メソッドを呼び出す必要があります。
$obj = new Obj;
//this handler is a global function
$obj->off(Obj::EVENT_HELLO, 'function_name');
//this handler is an object method
$obj->off(Obj::EVENT_HELLO, [$object, 'methodName']);
//this handler is a static class method
$obj->off(Obj::EVENT_HELLO, ['app\components\MyComponent', 'methodName']);
//this handler is an anonymous function
$obj->off(Obj::EVENT_HELLO, function ($event) {
//event handling logic
});
Yii-イベントの作成
この章では、Yiiでイベントを作成する方法を説明します。 実行中のイベントを表示するには、データが必要です。
DBの準備
- ステップ1 *-新しいデータベースを作成します。 データベースは、次の2つの方法で準備できます。
- ターミナルで_mysql -u root –p_を実行します
- _CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci; _を介して新しいデータベースを作成します
ステップ2 *- *config/db.php ファイルでデータベース接続を設定します。 次の構成は、現在使用されているシステム用です。
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
];
?>
ステップ3 *-ルートフォルダー内で./yii migrate/create test_table *を実行します。 このコマンドは、DBを管理するためのデータベース移行を作成します。 移行ファイルは、プロジェクトルートの *migrations フォルダーに表示されます。
ステップ4 *-この方法で移行ファイル(この場合は *m160106_163154_test_table.php )を変更します。
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160106_163154_test_table extends Migration {
public function safeUp() {
$this->createTable("user", [
"id" => Schema::TYPE_PK,
"name" => Schema::TYPE_STRING,
"email" => Schema::TYPE_STRING,
]);
$this->batchInsert("user", ["name", "email"], [
["User1", "[email protected]"],
["User2", "[email protected]"],
["User3", "[email protected]"],
["User4", "[email protected]"],
["User5", "[email protected]"],
["User6", "[email protected]"],
["User7", "[email protected]"],
["User8", "[email protected]"],
["User9", "[email protected]"],
["User10", "[email protected]"],
["User11", "[email protected]"],
]);
}
public function safeDown() {
$this->dropTable('user');
}
}
?>
上記の移行では、id、name、およびemailのフィールドを持つ user テーブルが作成されます。 また、いくつかのデモユーザーを追加します。
- ステップ5 *-プロジェクトのルート内で./yii migrate *を実行して、データベースに移行を適用します。
ステップ6 *-次に、 *user テーブルのモデルを作成する必要があります。 簡単にするために、 Gii コード生成ツールを使用します。 この url:http://localhost:8080/index.php?r = gii を開きます。 次に、「Model generator」ヘッダーの下にある「Start」ボタンをクリックします。 テーブル名(「ユーザー」)とモデルクラス(「MyUser」)を入力し、「プレビュー」ボタンをクリックして、最後に「生成」ボタンをクリックします。
MyUserモデルがモデルディレクトリに表示されます。
イベントを作成する
新しいユーザーがWebサイトに登録するたびに、管理者にメールを送信するとします。
ステップ1 *-このように *models/MyUser.php ファイルを変更します。
<?php
namespace app\models;
use Yii;
/**
*This is the model class for table "user".
*
*@property integer $id
* @property string $name
*@property string $email
*/
class MyUser extends \yii\db\ActiveRecord {
const EVENT_NEW_USER = 'new-user';
public function init() {
//first parameter is the name of the event and second is the handler.
$this->on(self::EVENT_NEW_USER, [$this, 'sendMailToAdmin']);
}
/**
*@inheritdoc
*/
public static function tableName() {
return 'user';
}
/**
*@inheritdoc
*/
public function rules() {
return [
[[name', 'email'], 'string', 'max' => 255]
];
}
/**
*@inheritdoc
*/
public function attributeLabels() {
return [
'id' => 'ID',
'name' => 'Name',
'email' => 'Email',
];
}
public function sendMailToAdmin($event) {
echo 'mail sent to admin using the event';
}
}
?>
上記のコードでは、「新規ユーザー」イベントを定義しています。 次に、init()メソッドで sendMailToAdmin 関数を「new-user」イベントに添付します。 次に、このイベントをトリガーする必要があります。
ステップ2 *-SiteControllerで *actionTestEvent というメソッドを作成します。
public function actionTestEvent() {
$model = new MyUser();
$model->name = "John";
$model->email = "[email protected]";
if($model->save()) {
$model->trigger(MyUser::EVENT_NEW_USER);
}
}
上記のコードでは、新しいユーザーを作成し、「new-user」イベントをトリガーします。
ステップ3 *- *http://localhost:8080/index.php?r = site/test-event と入力すると、次のように表示されます。
Yii-行動
動作は、yii \ base \ Behaviorクラスのインスタンスです。 ビヘイビアは、メソッドとプロパティをアタッチされたコンポーネントに注入します。 動作は、コンポーネントによってトリガーされたイベントに応答することもできます。
ステップ1 *-動作を定義するには、 *yii \ base \ Behavior クラスを拡張します。
namespace app\components;
use yii\base\Behavior;
class MyBehavior extends Behavior {
private $_prop1;
public function getProp1() {
return $this->_prop1;
}
public function setProp1($value) {
$this->_prop1 = $value;
}
public function myFunction() {
//...
}
}
上記のコードは、1つのプロパティ(prop1)と1つのメソッド(myFunction)で動作を定義しています。 この動作がコンポーネントに関連付けられている場合、そのコンポーネントには prop1 プロパティと myFunction メソッドもあります。
- 動作が関連付けられているコンポーネントにアクセスするには、* yii \ base \ Behavior
- $ ownerプロパティ*を使用できます。
- ステップ2 *-コンポーネントイベントに動作を応答させたい場合は、 yii \ base \ Behavior
- events()*メソッドをオーバーライドする必要があります。
namespace app\components;
use yii\db\ActiveRecord;
use yii\base\Behavior;
class MyBehavior extends Behavior {
public function events() {
return [
ActiveRecord::EVENT_AFTER_VALIDATE => 'afterValidate',
];
}
public function afterValidate($event) {
//...
}
}
ステップ3 *-ビヘイビアをアタッチするには、コンポーネントクラスの behaviors()*メソッドをオーバーライドする必要があります。
namespace app\models;
use yii\db\ActiveRecord;
use app\components\MyBehavior;
class MyUser extends ActiveRecord {
public function behaviors() {
return [
//anonymous behavior, behavior class name only
MyBehavior::className(),
//named behavior, behavior class name only
'myBehavior2' => MyBehavior::className(),
//anonymous behavior, configuration array
[
'class' => MyBehavior::className(),
'prop1' => 'value1',
'prop2' => 'value2',
'prop3' => 'value3',
],
//named behavior, configuration array
'myBehavior4' => [
'class' => MyBehavior::className(),
'prop1' => 'value1'
]
];
}
}
- *ステップ4 *-ビヘイビアーをデタッチするには、yii \ base \ Component
- detachBehavior()*メソッドを呼び出します。
$component->detachBehavior('myBehavior');
実際の動作を示すには、データが必要です。
DBの準備
- ステップ1 *-新しいデータベースを作成します。 データベースは、次の2つの方法で準備できます。
- ターミナルで_mysql -u root –p_を実行します。
- _CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci; _を介して新しいデータベースを作成します
ステップ2 *- *config/db.php ファイルでデータベース接続を設定します。 次の構成は、現在使用されているシステム用です。
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host = localhost;dbname = helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
];
?>
ステップ3 *-ルートフォルダー内で./yii migrate/create test_table *を実行します。 このコマンドは、DBを管理するためのデータベース移行を作成します。 移行ファイルは、プロジェクトルートの *migrations フォルダーに表示されます。
ステップ4 *-この方法で移行ファイル(この場合は *m160106_163154_test_table.php )を変更します。
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160106_163154_test_table extends Migration {
public function safeUp() {
$this->createTable("user", [
"id" => Schema::TYPE_PK,
"name" => Schema::TYPE_STRING,
"email" => Schema::TYPE_STRING,
]);
$this->batchInsert("user", ["name", "email"], [
["User1", "[email protected]"],
["User2", "[email protected]"],
["User3", "[email protected]"],
["User4", "[email protected]"],
["User5", "[email protected]"],
["User6", "[email protected]"],
["User7", "[email protected]"],
["User8", "[email protected]"],
["User9", "[email protected]"],
["User10", "[email protected]"],
["User11", "[email protected]"],
]);
}
public function safeDown() {
$this->dropTable('user');
}
}
?>
上記の移行では、id、name、およびemailのフィールドを持つ user テーブルが作成されます。 また、いくつかのデモユーザーを追加します。
ステップ5 *-プロジェクトルート *run。/yii migrate 内で、データベースに移行を適用します。
ステップ6 *-次に、*ユーザーテーブル*のモデルを作成する必要があります。 簡単にするために、 *Gii コード生成ツールを使用します。 この url:http://localhost:8080/index.php?r = gii を開きます。 次に、「Model generator」ヘッダーの下にある「Start」ボタンをクリックします。 テーブル名(「ユーザー」)とモデルクラス(「MyUser」)を入力し、「プレビュー」ボタンをクリックして、最後に「生成」ボタンをクリックします。
MyUserモデルがモデルディレクトリに表示されます。
Yii-ビヘイビアの作成
ビヘイビアが関連付けられているコンポーネントの「名前」プロパティを大文字にするビヘイビアを作成するとします。
ステップ1 *-componentsフォルダー内で、次のコードで *UppercaseBehavior.php というファイルを作成します。
<?php
namespace app\components;
use yii\base\Behavior;
use yii\db\ActiveRecord;
class UppercaseBehavior extends Behavior {
public function events() {
return [
ActiveRecord::EVENT_BEFORE_VALIDATE => 'beforeValidate',
];
}
public function beforeValidate($event) {
$this->owner->name = strtoupper($this->owner->name);
}
}
?>
上記のコードでは、「UppercaseBehavior *」を作成します。これは、「beforeValidate」イベントがトリガーされたときにnameプロパティを大文字にします。
ステップ2 *-この動作を *MyUser モデルに関連付けるには、この方法で変更します。
<?php
namespace app\models;
use app\components\UppercaseBehavior;
use Yii;
/**
*This is the model class for table "user".
*
*@property integer $id
* @property string $name
*@property string $email
*/
class MyUser extends \yii\db\ActiveRecord {
public function behaviors() {
return [
//anonymous behavior, behavior class name only
UppercaseBehavior::className(),
];
}
/**
*@inheritdoc
*/
public static function tableName() {
return 'user';
}
/**
*@inheritdoc
*/
public function rules() {
return [
[[name', 'email'], 'string', 'max' => 255]
];
}
/**
*@inheritdoc
*/
public function attributeLabels() {
return [
'id' => 'ID',
'name' => 'Name',
'email' => 'Email',
];
}
}
?>
これで、ユーザーを作成または更新するたびに、その名前プロパティは大文字になります。
ステップ3 *- *actionTestBehavior 関数を SiteController に追加します。
public function actionTestBehavior() {
//creating a new user
$model = new MyUser();
$model->name = "John";
$model->email = "[email protected]";
if($model->save()){
var_dump(MyUser::find()->asArray()->all());
}
}
ステップ4 *-アドレスバーに *http://localhost:8080/index.php?r = site/test-behavior と入力すると、新しく作成された MyUser モデルの name プロパティが含まれていることがわかります。大文字。
Yii-設定
構成は、新しいオブジェクトの作成または既存のオブジェクトの初期化に使用されます。 通常、構成にはクラス名と初期値のリストが含まれます。 また、イベントハンドラーと動作のリストを含めることもできます。
以下は、データベース構成の例です-
<?php
$config = [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host = localhost;dbname = helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
];
$db = Yii::createObject($config);
?>
- Yii :: createObject()*メソッドは構成配列を受け取り、構成で指定されたクラスに基づいてオブジェクトを作成します。
構成の形式-
[
//a fully qualified class name for the object being created
'class' => 'ClassName',
//initial values for the named property
'propertyName' => 'propertyValue',
//specifies what handlers should be attached to the object's events
'on eventName' => $eventHandler,
//specifies what behaviors should be attached to the object
'as behaviorName' => $behaviorConfig,
]
基本的なアプリケーションテンプレートの構成ファイルは、最も複雑なものの一つです-
<?php
$params = require(__DIR__ . '/params.php');
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
//!!! insert a secret key in the following (if it is empty) - this
//is required by cookie validation
'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
//send all mails to a file by default. You have to set
//'useFileTransport' to false and configure a transport
//for the mailer to send real emails.
'useFileTransport' => true,
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'urlManager' => [
//'showScriptName' => false,
//'enablePrettyUrl' => true,
//'enableStrictParsing' => true,
//'suffix' => '/'
],
'db' => require(__DIR__ . '/db.php'),
],
'modules' => [
'hello' => [
'class' => 'app\modules\hello\Hello',
],
],
'params' => $params,
];
if (YII_ENV_DEV) {
//configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
return $config;
?>
上記の構成ファイルでは、クラス名を定義していません。 これは、すでに index.php ファイルで定義されているためです-
<?php
//defining global constans
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
//register composer autoloader
require(__DIR__ . '/../vendor/autoload.php');
//include yii files
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
//load application config
$config = require(__DIR__ . '/../config/web.php');
//create, config, and process request
(new yii\web\Application($config))->run();
?>
多くのウィジェットは、次のコードに示すような構成も使用します。
<?php
NavBar::begin([
'brandLabel' => 'My Company',
'brandUrl' => Yii::$app->homeUrl,
'options' => [
'class' => 'navbar-inverse navbar-fixed-top',
],
]);
echo Nav::widget([
'options' => ['class' => 'navbar-nav navbar-right'],
'items' => [
['label' => 'Home', 'url' => ['/site/index']],
['label' => 'About', 'url' => ['/site/about']],
['label' => 'Contact', 'url' => ['/site/contact']],
Yii::$app->user->isGuest ?
['label' => 'Login', 'url' => ['/site/login']] :
[
'label' => 'Logout (' . Yii::$app->user->identity->username . ')',
'url' => ['/site/logout'],
'linkOptions' => ['data-method' => 'post']
],
],
]);
NavBar::end();
?>
構成が複雑すぎる場合、一般的な方法は、配列を返すPHPファイルを作成することです。 config/console.php 設定ファイルを見てください-
<?php
Yii::setAlias('@tests', dirname(__DIR__) . '/tests');
$params = require(__DIR__ . '/params.php');
$db = require(__DIR__ . '/db.php');
return [
'id' => 'basic-console',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log', 'gii'],
'controllerNamespace' => 'app\commands',
'modules' => [
'gii' => 'yii\gii\Module',
],
'components' => [
'cache' => [
'class' => 'yii\caching\FileCache',
],
'log' => [
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'db' => $db,
],
'params' => $params,
];
?>
- デフォルト構成は、* Yii
- $ container→ set()*メソッドを呼び出すことで指定できます。 * Yii :: createObject()*メソッドを介して呼び出されると、指定されたクラスのすべてのインスタンスにデフォルト設定を適用できます。
たとえば、すべてのリンクページャーが最大3つのボタンを表示するように yii \ widgets \ LinkPager クラスをカスタマイズするには、次のコードを使用できます。
\Yii::$container->set('yii\widgets\LinkPager', [
'maxButtonCount' => 3,
]);
Yii-依存性注入
DI(依存性注入)コンテナは、オブジェクトのインスタンス化および構成方法を知っているオブジェクトです。 Yiiは* yii \ di \ Containerクラス*を介してDIコンテナを提供します。
次の種類のDIをサポートしています-
- セッターおよびプロパティインジェクション
- PHP呼び出し可能インジェクション
- コンストラクタインジェクション
- コントローラーアクションインジェクション
DIコンテナは、タイプヒントの助けを借りてコンストラクタインジェクションをサポートしています-
class Object1 {
public function __construct(Object2 $object2) {
}
}
$object1 = $container->get('Object1');
//which is equivalent to the following:
$object2 = new Object2;
$object1 = new Object1($object2);
プロパティとセッターの注入は、構成を介してサポートされています-
<?php
use yii\base\Object;
class MyObject extends Object {
public $var1;
private $_var2;
public function getVar2() {
return $this->_var2;
}
public function setVar2(MyObject2 $var2) {
$this->_var2 = $var2;
}
}
$container->get('MyObject', [], [
'var1' => $container->get('MyOtherObject'),
'var2' => $container->get('MyObject2'),
]);
?>
PHPの呼び出し可能インジェクションの場合、コンテナは登録されたPHPコールバックを使用してクラスの新しいインスタンスを構築します-
$container->set('Object1', function () {
$object1 = new Object1(new Object2);
return $object1;
});
$object1 = $container->get('Object1');
コントローラーアクションインジェクションは、タイプヒントを使用して依存関係が宣言されるDIの一種です。 MVCコントローラーをスリムで軽量かつスリムに保つのに役立ちます-
public function actionSendToAdmin(EmailValidator $validator, $email) {
if ($validator->validate($email)) {
//sending email
}
}
- yii \ db \ Container :: set()*メソッドを使用して、依存関係を登録できます-
<?php
$container = new \yii\di\Container;
//register a class name as is. This can be skipped.
$container->set('yii\db\Connection');
//register an alias name. You can use $container->get('MyObject')
//to create an instance of Connection
$container->set('MyObject', 'yii\db\Connection');
//register an interface
//When a class depends on the interface, the corresponding class
//will be instantiated as the dependent object
$container->set('yii\mail\MailInterface', 'yii\swiftmailer\Mailer');
//register an alias name with class configuration
//In this case, a "class" element is required to specify the class
$container->set('db', [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=127.0.0.1;dbname = helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
]);
//register a class with configuration. The configuration
//will be applied when the class is instantiated by get()
$container->set('yii\db\Connection', [
'dsn' => 'mysql:host=127.0.0.1;dbname = helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
]);
//register a PHP callable
//The callable will be executed each time when $container->get('db') is called
$container->set('db', function ($container, $params, $config) {
return new \yii\db\Connection($config);
});
//register a component instance
//$container->get('pageCache') will return the same instance each time when it
//is called
$container->set('pageCache', new FileCache);
?>
DIを使用する
ステップ1 *- *components フォルダー内に、次のコードで MyInterface.php というファイルを作成します。
<?php
namespace app\components;
interface MyInterface {
public function test();
}
?>
- ステップ2 *-componentsフォルダー内に2つのファイルを作成します。
*First.php* -
<?php
namespace app\components;
use app\components\MyInterface;
class First implements MyInterface {
public function test() {
echo "First class <br>";
}
}
?>
*Second.php* -
<?php
app\components;
use app\components\MyInterface;
class Second implements MyInterface {
public function test() {
echo "Second class <br>";
}
}
?>
ステップ3 *-次に、 *actionTestInterface をSiteControllerに追加します。
public function actionTestInterface() {
$container = new \yii\di\Container();
$container->set
("\app\components\MyInterface","\app\components\First");
$obj = $container->get("\app\components\MyInterface");
$obj->test();//print "First class"
$container->set
("\app\components\MyInterface","\app\components\Second");
$obj = $container->get("\app\components\MyInterface");
$obj->test();//print "Second class"
}
ステップ4 *- *http://localhost:8080/index.php?r = site/test-interface にアクセスすると、以下が表示されます。
この方法は、1か所でクラスを設定でき、他のコードは新しいクラスを自動的に使用するため便利です。
Yii-データベースアクセス
Yii DAO(データベースアクセスオブジェクト)は、データベースにアクセスするためのAPIを提供します。 また、他のデータベースアクセス方法の基盤としても機能します。アクティブレコードとクエリビルダーです。
Yii DAOは以下のデータベースをサポートしています-
- MySQL
- MSSQL
- SQLite
- MariaDB
- PostgreSQL
- オラクル
- CUBRID
データベース接続の作成
- ステップ1 *-データベース接続を作成するには、yii \ db \ Connectionクラスのインスタンスを作成する必要があります。
$mydb = new yii\db\Connection([
'dsn' => 'mysql:host=localhost;dbname=mydb',
'username' => 'username',
'password' => 'password',
'charset' => 'utf8',
]);
一般的な方法は、アプリケーションコンポーネント内でDB接続を構成することです。 たとえば、基本的なアプリケーションテンプレートでは、次のコードに示すように、DB接続構成は config/db.php ファイルにあります。
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host = localhost;dbname = helloworld',
'username' => 'vladimir',
'password' => '123574896',
'charset' => 'utf8',
];
?>
- ステップ2 *-DB接続にアクセスするには、この式を使用できます。
Yii::$app->db
DB接続を設定するには、 dsn プロパティを介してそのDSN(データソース名)を指定する必要があります。 DSN形式はデータベースごとに異なります-
- MySQL、MariaDB -mysql:host = localhost; dbname = mydb
- PostgreSQL -pgsql:host = localhost; port = 5432; dbname = mydb
- SQLite -sqlite:/path/to/db/file
- * MS SQL Server(sqlsrvドライバー経由)*-sqlsrv:Server = localhost; Database = mydb
- * MS SQL Server(mssqlドライバ経由)*-mssql:host = localhost; dbname = mydb
- * MS SQL Server(dblibドライバー経由)*-dblib:host = localhost; dbname = mydb
- CUBRID -cubrid:dbname = mydb; host = localhost; port = 33000
- Oracle -oci:dbname =//localhost:1521/mydb
実行中のデータベースクエリを表示するには、データが必要です。
DBの準備
- ステップ1 *-新しいデータベースを作成します。 データベースは、次の2つの方法で準備できます。
- ターミナルで_mysql -u root –p_を実行します。
- _CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci; _を介して新しいデータベースを作成します
ステップ2 *- *config/db.php ファイルでデータベース接続を設定します。 次の構成は、現在使用されているシステム用です。
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host = localhost;dbname = helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
];
?>
ステップ3 *-ルートフォルダー内で./yii migrate/create test_table *を実行します。 このコマンドは、DBを管理するためのデータベース移行を作成します。 移行ファイルは、プロジェクトルートの *migrations フォルダーに表示されます。
ステップ4 *-この方法で移行ファイル(この場合は *m160106_163154_test_table.php )を変更します。
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160106_163154_test_table extends Migration {
public function safeUp() {
$this->createTable("user", [
"id" => Schema::TYPE_PK,
"name" => Schema::TYPE_STRING,
"email" => Schema::TYPE_STRING,
]);
$this->batchInsert("user", ["name", "email"], [
["User1", "[email protected]"],
["User2", "[email protected]"],
["User3", "[email protected]"],
["User4", "[email protected]"],
["User5", "[email protected]"],
["User6", "[email protected]"],
["User7", "[email protected]"],
["User8", "[email protected]"],
["User9", "[email protected]"],
["User10", "[email protected]"],
["User11", "[email protected]"],
]);
}
public function safeDown() {
$this->dropTable('user');
}
}
?>
上記の移行では、id、name、およびemailのフィールドを持つ user テーブルが作成されます。 また、いくつかのデモユーザーを追加します。
- ステップ5 *-プロジェクトのルート内で./yii migrate *を実行して、データベースに移行を適用します。
ステップ6 *-次に、 *user テーブルのモデルを作成する必要があります。 簡単にするために、 Gii コード生成ツールを使用します。 この url:http://localhost:8080/index.php?r = gii を開きます。 次に、「Model generator」ヘッダーの下にある「Start」ボタンをクリックします。 テーブル名(「ユーザー」)とモデルクラス(「MyUser」)を入力し、「プレビュー」ボタンをクリックして、最後に「生成」ボタンをクリックします。
MyUserモデルがモデルディレクトリに表示されます。
Yii-データアクセスオブジェクト
- SQLクエリ*を実行するには、次の手順に従う必要があります-
- SQLクエリを使用して_yii \ db \ Command_を作成します。
- バインドパラメーター(必須ではありません)
- コマンドを実行します。
ステップ1 *-SiteControllerで *actionTestDb という関数を作成します。
public function actionTestDb(){
//return a set of rows. each row is an associative array of column names and values.
//an empty array is returned if the query returned no results
$users = Yii::$app->db->createCommand('SELECT *FROM user LIMIT 5')
->queryAll();
var_dump($users);
//return a single row (the first row)
//false is returned if the query has no result
$user = Yii::$app->db->createCommand('SELECT* FROM user WHERE id=1')
->queryOne();
var_dump($user);
//return a single column (the first column)
//an empty array is returned if the query returned no results
$userName = Yii::$app->db->createCommand('SELECT name FROM user')
->queryColumn();
var_dump($userName);
//return a scalar value
//false is returned if the query has no result
$count = Yii::$app->db->createCommand('SELECT COUNT(*) FROM user')
->queryScalar();
var_dump($count);
}
上記の例は、DBからデータを取得するさまざまな方法を示しています。
ステップ2 *-アドレス *http://localhost:8080/index.php?r = site/test-db にアクセスすると、次の出力が表示されます。
SQLコマンドを作成する
パラメータを使用してSQLコマンドを作成するには、常にパラメータをバインドするアプローチを使用して、SQLインジェクションを防ぐ必要があります。
ステップ1 *-この方法で *actionTestDb メソッドを変更します。
public function actionTestDb() {
$firstUser = Yii::$app->db->createCommand('SELECT *FROM user WHERE id = :id')
->bindValue(':id', 1)
->queryOne();
var_dump($firstUser);
$params = [':id' => 2, ':name' => 'User2'];
$secondUser = Yii::$app->db->createCommand('SELECT* FROM user WHERE
id = :id AND name = :name')
->bindValues($params)
->queryOne();
var_dump($secondUser);
//another approach
$params = [':id' => 3, ':name' => 'User3'];
$thirdUser = Yii::$app->db->createCommand('SELECT * FROM user WHERE
id = :id AND name = :name', $params)
->queryOne();
var_dump($thirdUser);
}
上記のコードで-
- * bindValue()*-単一のパラメーター値をバインドします。
- * bindValues()*-複数のパラメーター値をバインドします。
ステップ2 *-アドレス *http://localhost:8080/index.php?r = site/test-db にアクセスすると、次の出力が表示されます。
INSERT、UPDATE、DELETEクエリ
INSERT、UPDATE、およびDELETEクエリの場合、insert()、update()、およびdelete()メソッドを呼び出すことができます。
ステップ1 *-この方法で *actionTestDb メソッドを変更します。
public function actionTestDb() {
public function actionTestDb(){
//INSERT (table name, column values)
Yii::$app->db->createCommand()->insert('user', [
'name' => 'My New User',
'email' => '[email protected]',
])->execute();
$user = Yii::$app->db->createCommand('SELECT *FROM user WHERE name = :name')
->bindValue(':name', 'My New User')
->queryOne();
var_dump($user);
//UPDATE (table name, column values, condition)
Yii::$app->db->createCommand()->update('user', ['name' => 'My New User
Updated'], 'name = "My New User"')->execute();
$user = Yii::$app->db->createCommand('SELECT* FROM user WHERE name = :name')
->bindValue(':name', 'My New User Updated')
->queryOne();
var_dump($user);
//DELETE (table name, condition)
Yii::$app->db->createCommand()->delete('user', 'name = "My New User
Updated"')->execute();
$user = Yii::$app->db->createCommand('SELECT * FROM user WHERE name = :name')
->bindValue(':name', 'My New User Updated')
->queryOne();
var_dump($user);
}
}
ステップ2 *-WebブラウザのアドレスバーにURL *http://localhost:8080/index.php?r = site/test-db を入力すると、次の出力が表示されます。
Yii-クエリビルダー
クエリビルダーを使用すると、プログラムでSQLクエリを作成できます。 クエリビルダーを使用すると、より読みやすいSQL関連のコードを記述できます。
クエリビルダーを使用するには、次の手順に従う必要があります-
yii \ db \ Queryオブジェクトを作成します。
クエリメソッドを実行します。
*yii \ db \ Query* オブジェクトを作成するには、さまざまなクエリビルダー関数を呼び出して、SQLクエリのさまざまな部分を定義する必要があります。
ステップ1 *-クエリビルダーの一般的な使用法を示すには、 *actionTestDb メソッドをこのように変更します。
public function actionTestDb() {
//generates "SELECT id, name, email FROM user WHERE name = 'User10';"
$user = (new \yii\db\Query())
->select(['id', 'name', 'email'])
->from('user')
->where(['name' => 'User10'])
->one();
var_dump($user);
}
ステップ2 *- *http://localhost:8080/index.php?r = site/test-db に移動すると、次の出力が表示されます。
Where()関数
- where()関数は、クエリのWHEREフラグメントを定義します。 *WHERE 条件を指定するには、3つの形式を使用できます。
- 文字列形式-'name = User10'
- ハッシュ形式-['name' ⇒ 'User10'、 'email ⇒ [email protected]']
- 演算子形式-['like'、 'name'、 'User']
文字列形式の例
public function actionTestDb() {
$user = (new \yii\db\Query())
->select(['id', 'name', 'email'])
->from('user')
->where('name = :name', [':name' => 'User11'])
->one();
var_dump($user);
}
出力は次のようになります。
ハッシュ形式の例
public function actionTestDb() {
$user = (new \yii\db\Query())
->select(['id', 'name', 'email'])
->from('user')
->where([
'name' => 'User5',
'email' => '[email protected]'
])
->one();
var_dump($user);
}
出力は次のようになります。
演算子形式では、次の形式で任意の条件を定義することができます-
[operator, operand1, operand2]
演算子はすることができます-
- and − ['and'、 'id = 1'、 'id = 2']は、id = 1 AND id = 2を生成します:または オペレーター
- between -['between'、 'id'、1、15]は、ID BETWEEN 1 AND 15を生成します
- not between -between演算子に似ていますが、BETWEENはNOT BETWEENに置き換えられます
- in -['in'、 'id'、[5,10,15]]はid IN(5,10,15)を生成します
- not in -in演算子に似ていますが、INはNOT INに置き換えられます
- like -['like'、 'name'、 'user']は、名前LIKE '%user%'を生成します
- *またはlike *-like演算子に似ていますが、ORを使用してLIKE述語を分割します
- not like -like演算子に似ていますが、LIKEはNOT LIKEに置き換えられます
- *またはnot like *-not like演算子に似ていますが、ORを使用してNOT LIKE述語を連結します
- exists -yii \ db \ Queryのインスタンスでなければならない1つのオペランドが必要です クラス
- not exists -exists演算子に似ていますが、NOT EXISTS(サブクエリ)式を作成します
- * <、⇐、>、> =、*、またはその他のDB演算子:['<'、 'id'、10]はid <10を生成します
演算子形式の例
public function actionTestDb() {
$users = (new \yii\db\Query())
->select(['id', 'name', 'email'])
->from('user')
->where(['between', 'id', 5, 7])
->all();
var_dump($users);
}
出力は次のようになります。
OrderBy()関数
- orderBy()*関数は、ORDER BYフラグメントを定義します。
例-
public function actionTestDb() {
$users = (new \yii\db\Query())
->select(['id', 'name', 'email'])
->from('user')
->orderBy('name DESC')
->all();
var_dump($users);
}
出力は次のようになります。
groupBy()関数
- groupBy()関数はGROUP BYフラグメントを定義し、 having()*メソッドはHAVINGフラグメントを指定します。
例-
public function actionTestDb() {
$users = (new \yii\db\Query())
->select(['id', 'name', 'email'])
->from('user')
->groupBy('name')
->having('id < 5')
->all();
var_dump($users);
}
出力は次のようになります。
- limit()および offset()メソッドは、 *LIMIT および OFFSET フラグメントを定義します。
例-
public function actionTestDb() {
$users = (new \yii\db\Query())
->select(['id', 'name', 'email'])
->from('user')
->limit(5)
->offset(5)
->all();
var_dump($users);
}
次の出力を見ることができます-
*yii \ db \ Query* クラスは、さまざまな目的のための一連のメソッドを提供します-
- * all()*-名前と値のペアの行の配列を返します。
- * one()*-最初の行を返します。
- * column()*-最初の列を返します。
- * scalar()*-結果の最初の行と最初の列からスカラー値を返します。
- * exists()*-クエリに結果が含まれているかどうかを示す値を返します
- * count()* COUNTクエリの結果を返します
- その他の集計クエリメソッド-sum($ q)、average($ q)、max($ q)、min($ q)が含まれます。 $ qパラメーターは、列名またはDB式のいずれかです。
Yii-アクティブレコード
Active Recordは、データにアクセスするためのオブジェクト指向APIを提供します。 Active Recordクラスはデータベーステーブルに関連付けられています。
Yiiは、次のリレーショナルデータベースのActive Recordサポートを提供します-
- MySQL 4.1以降
- SQLite 2および3:
- PostgreSQL 7.3以降
- Microsoft SQL Server 2008以降
- CUBRID 9.3以降
- オラクル
- ElasticSearch
- スフィンクス
さらに、Active Recordクラスは次の NoSQL データベースをサポートしています-
- Redis 2.6.12以降
- MongoDB 1.3.0以降
別のデータベーステーブルのActive Recordクラス(この例では MyUser モデル)を宣言した後、次の手順に従ってデータをクエリする必要があります-
- yii \ db \ ActiveRecord :: find()メソッドを使用して、新しいクエリオブジェクトを作成します。
- クエリオブジェクトを作成します。
- クエリメソッドを呼び出してデータを取得します。
ステップ1 *-このように actionTestDb()*メソッドを変更します。
public function actionTestDb() {
//return a single user whose ID is 1
//SELECT * FROM `user` WHERE `id` = 1
$user = MyUser::find()
->where(['id' => 1])
->one();
var_dump($user);
//return the number of users
//SELECT COUNT(*) FROM `user`
$users = MyUser::find()
->count();
var_dump($users);
//return all users and order them by their IDs
//SELECT * FROM `user` ORDER BY `id`
$users = MyUser::find()
->orderBy('id')
->all();
var_dump($users);
}
上記のコードは、ActiveQueryを使用してデータをクエリする方法を示しています。
ステップ2 *- *http://localhost:8080/index.php?r = site/test-db に移動すると、次の出力が表示されます。
主キー値または列値のセットによるクエリは一般的なタスクであるため、Yiiは次のメソッドを提供します-
- * yii \ db \ ActiveRecord :: findOne()*-単一のアクティブレコードインスタンスを返します
- * yi \ db \ ActiveRecord :: findAll()*-Active Recordインスタンスの配列を返します
例-
public function actionTestDb() {
//returns a single customer whose ID is 1
//SELECT *FROM `user` WHERE `id` = 1
$user = MyUser::findOne(1);
var_dump($user);
//returns customers whose ID is 1,2,3, or 4
//SELECT* FROM `user` WHERE `id` IN (1,2,3,4)
$users = MyUser::findAll([1, 2, 3, 4]);
var_dump($users);
//returns a user whose ID is 5
//SELECT * FROM `user` WHERE `id` = 5
$user = MyUser::findOne([
'id' => 5
]);
var_dump($user);
}
データベースにデータを保存する
- データベースにデータを保存するには、* yii \ db \ ActiveRecord
- save()*メソッドを呼び出す必要があります。
ステップ1 *-このように actionTestDb()*メソッドを変更します。
public function actionTestDb() {
//insert a new row of data
$user = new MyUser();
$user->name = 'MyCustomUser2';
$user->email = '[email protected]';
$user->save();
var_dump($user->attributes);
//update an existing row of data
$user = MyUser::findOne(['name' => 'MyCustomUser2']);
$user->email = '[email protected]';
$user->save();
var_dump($user->attributes);
}
ステップ2 *- *http://localhost:8080/index.php?r = site/test-db に移動すると、次の出力が表示されます。
データの単一の行を削除するには、する必要があります-
- アクティブレコードインスタンスを取得する
- yii \ db \ ActiveRecord :: delete() メソッドを呼び出します
ステップ1 *-このように actionTestDb()*メソッドを変更します。
public function actionTestDb() {
$user = MyUser::findOne(2);
if($user->delete()) {
echo "deleted";
}
}
ステップ2 *-Webブラウザのアドレスバーに *http://localhost:8080/index.php?r = site/test-db と入力すると、次の出力が表示されます。
- ステップ3 *- yii \ db \ ActiveRecord
- deleteAll()*メソッドを呼び出して、複数のデータ行を削除することもできます。
public function actionTestDb() {
MyUser::deleteAll('id >= 20');
}
Yii-データベースの移行
データベース駆動型アプリケーションの開発中、データベース構造はソースコードとともに進化します。 Yiiは、データベースの変更を追跡できる database migration 機能を提供します。
Yiiは、次の移行コマンドラインツールを提供します-
- 新しい移行を作成する
- 移行を元に戻す
- 移行を適用する
- 移行を再適用する
- 移行ステータスと履歴を表示する
移行の作成
新しいデータベース移行を作成しましょう。
- ステップ1 *-基本的なアプリケーションテンプレートのプロジェクトルート内で、コンソールウィンドウを開いて実行します。
./yii migrate/create add_news_table
上記のコマンドは、 migrations フォルダーに新しい移行ファイル(この場合はm160113_102634_add_news_table.php)を作成します。
ファイルには次のコードが含まれています-
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160113_102634_add_news_table extends Migration {
public function up() {
}
public function down() {
echo "m160113_102634_add_news_table cannot be reverted.\n";
return false;
}
/*
//Use safeUp/safeDown to run migration code within a transaction
public function safeUp() {
}
public function safeDown() {
}
*/
}
?>
各DB移行は、 yii \ db \ Migration クラスを拡張するPHPクラスです。 クラス名は、次の形式で生成されます-
m<YYMMDD_HHMMSS>_<Name>
ここで、 <YYMMDD_HMMSS> は移行コマンドが実行されたUTC日時で、<Name>はコンソールコマンドで指定した引数です。
データベースをアップグレードするとup()メソッドが呼び出され、データベースをダウングレードするとdown()メソッドが呼び出されます。
- ステップ2 *-新しいテーブルをデータベースに追加するには、この方法で移行ファイルを変更します。
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160113_102634_add_news_table extends Migration {
public function up() {
$this->createTable("news", [
"id" => Schema::TYPE_PK,
"title" => Schema::TYPE_STRING,
"content" => Schema::TYPE_TEXT,
]);
}
public function down() {
$this->dropTable('news');
}
/*
//Use safeUp/safeDown to run migration code within a transaction
public function safeUp() {
}
public function safeDown() {
}
*/
}
?>
上記のコードでは、* up()メソッドでnewsという新しいテーブルを作成し、 down()*メソッドでこのテーブルを削除しました。
*news* テーブルは、id、title、およびcontentの3つのフィールドで構成されています。 テーブルまたは列を作成するときは、移行がデータベースの種類に依存しないように、抽象型を使用する必要があります。 たとえば、MySQLの場合、TYPE_PKはint(11)NOT NUL AUTO_INCREMETN PRIMARY KEYに変換されます。
- ステップ3 *-データベースをアップグレードするには、このコマンドを実行します。
./yii migrate
上記のコマンドは、まだ適用されていない利用可能なすべての移行を一覧表示します。 次に、移行の適用を確認すると、すべての新しい移行クラスでsafeUp()またはup()が実行されます。
- ステップ4 *-利用可能な移行を3つだけ適用するには、実行できます。
./yii migrate 3
- ステップ5 *-データベースを移行する特定の移行を定義することもできます。
#タイムスタンプを使用して移行を指定する
yii migrate/to 160202_195501
#strtotime()で解析できる文字列を使用
yii migrate/to "2016-01-01 19:55:01"
#フルネームを使用
yii migrate/to m160202_195501_create_news_table
#UNIXタイムスタンプを使用
yii migrate/to 1393964718
- ステップ6 *-移行を元に戻すには(down()またはsafeDown()メソッドを実行)、実行します。
./yii migrate/down
- ステップ7 *-最も最近適用された5つの移行を元に戻すには、実行できます。
./yii migrate/down 5
- ステップ8 *-移行をやり直す(元に戻してから再度適用する)には、実行します。
./yii migrate/redo
すでに適用された移行を一覧表示するには、これらのコマンドを使用します-
- yii migrate/new #最初の10個の新しい移行を表示
- yii migrate/new 3 #最初の3つの新しい移行を示します
- yii migrate/new all #すべての新しい移行を表示
- yii migrate/history #最後に適用された10個の移行を表示
- yii migrate/history 20 #最後に適用された20個の移行を表示
- yii migrate/history all #適用されたすべての移行を表示
特定のテーブルから列を追加または削除する必要がある場合があります。 * addColumn()および dropColumn()*メソッドを使用できます。
- ステップ1 *-新しい移行を作成します。
./yii migrate/create add_category_to_news
- ステップ2 *-新しく作成した移行ファイルをこの方法で変更します。
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160113_110909_add_category_to_news extends Migration {
public function up() {
$this->addColumn('news', 'category', $this->integer());
}
public function down() {
$this->dropColumn('news', 'category');
}
}
?>
ここで、。/yii migrate *を実行すると、カテゴリテーブルがニューステーブルに追加されます。 逆に、。/yii migrate/down 1 *を実行すると、カテゴリ列は削除されます。
DB移行を実行する場合、各移行が成功または失敗したことを確認することが重要です。 DB操作をトランザクションで囲むことをお勧めします。 トランザクション移行を実装するには、* safeUp()および safeDown()*メソッドに移行コードを配置するだけです。 これらのメソッドのいずれかの操作が失敗すると、以前のすべての操作がロールバックされます。
「トランザクション方式」の前の例は次のようになります-
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160113_110909_add_category_to_news extends Migration {
public function safeUp() {
$this->addColumn('news', 'category', $this->integer());
}
public function safeDown() {
$this->dropColumn('news', 'category');
}
}
?>
*yii \ db \ Migration* クラスは、データベースを操作するための以下のメソッドを提供します-
- * execute()*-生のSQLステートメントを実行します
- * createTable()*-テーブルを作成します
- * renameTable()*-テーブルの名前を変更
- * insert()*-単一の行を挿入します
- * batchInsert()*-複数の行を挿入
- * update()*-行を更新する
- * delete()*-行を削除します
- * addColumn()*-列を追加します
- * renameColumn()*-列の名前を変更します
- * dropColumn()*-列を削除します
- * alterColumn()*-列を変更します
- * dropTable()*-テーブルを削除します
- * truncateTable()*-テーブル内のすべての行を削除します
- * createIndex()*-インデックスを作成します
- * dropIndex()*-インデックスを削除します
- * addPrimaryKey()*-主キーを追加します
- * dropPrimaryKey()*-主キーを削除します
- * addForeignKey()*-外部キーを追加します
- * dropForeignKey()*-外部キーを削除します
Yii-テーマ
テーマを設定すると、元のビューファイルを変更することなく、一連のビューを別のビューに置き換えることができます。 テーマを使用するには、ビューアプリケーションコンポーネントの theme プロパティを設定する必要があります。
また、次のプロパティを定義する必要があります-
- yii \ base \ Theme :: $ basePath -CSS、JS、画像などのベースディレクトリを定義します。
- yii \ base \ Theme :: $ baseUrl -テーマのベースURLを定義します リソース。
- yii \ base \ Theme :: $ pathMap -置換ルールを定義します。
たとえば、UserControllerで* $ this→ render( 'create')を呼び出すと、 *@ app/views/user/create.php ビューファイルがレンダリングされます。 それでも、次のアプリケーション構成のようにテーマを有効にすると、代わりにビューファイル@ app/themes/basic/user/create.phpがレンダリングされます。
ステップ1 *- *config/web.php ファイルをこの方法で変更します。
<?php
$params = require(__DIR__ . '/params.php');
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
//!!! insert a secret key in the following (if it is empty) - this
//is required by cookie validation
'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
//send all mails to a file by default. You have to set
//'useFileTransport' to false and configure a transport
//for the mailer to send real emails.
'useFileTransport' => true,
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'view' => [
'theme' => [
'basePath' => '@app/themes/basic',
'baseUrl' => '@web/themes/basic',
'pathMap' => [
'@app/views' => '@app/themes/basic',
],
],
],
'db' => require(__DIR__ . '/db.php'),
],
'modules' => [
'hello' => [
'class' => 'app\modules\hello\Hello',
],
],
'params' => $params,
];
if (YII_ENV_DEV) {
//configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
return $config;
?>
ビューアプリケーションコンポーネントを追加しました。
ステップ2 *- *web/themes/basic ディレクトリ構造と themes/basic/site を作成します。 themes/basic/siteフォルダー内に、次のコードで about.php というファイルを作成します。
<?php
/*@var $this yii\web\View*/
use yii\helpers\Html;
$this->title = 'About';
$this->params['breadcrumbs'][] = $this->title;
$this->registerMetaTag(['name' => 'keywords', 'content' => 'yii, developing,
views, meta, tags']);
$this->registerMetaTag(['name' => 'description', 'content' => 'This is the
description of this page!'], 'description');
?>
<div class = "site-about">
<h1><?= Html::encode($this->title) ?></h1>
<p style = "color: red;">
This is the About page. You may modify the following file to customize its content:
</p>
</div>
ステップ3 *-次に、 *http://localhost:8080/index.php?r = site/about に移動し、* viewsの代わりに themes/basic/site/about.php ファイルがレンダリングされます/site/about.php*。
- *ステップ4 *-テーマモジュールに対して、このようにyii \ base \ Theme
- $ pathMapプロパティを設定します。
'pathMap' => [
'@app/views' => '@app/themes/basic',
'@app/modules' => '@app/themes/basic/modules',
],
- *ステップ5 *-ウィジェットをテーマにするには、 *yii \ base \ Theme
- $ pathMap* プロパティをこのように設定します。
'pathMap' => [
'@app/views' => '@app/themes/basic',
'@app/widgets' => '@app/themes/basic/widgets',//<-- !!!
],
アプリケーションの基本的なルックアンドフィールを含む基本テーマを指定する必要がある場合があります。 この目標を達成するために、テーマの継承を使用できます。
- ステップ6 *-この方法でビューアプリケーションコンポーネントを変更します。
'view' => [
'theme' => [
'basePath' => '@app/themes/basic',
'baseUrl' => '@web/themes/basic',
'pathMap' => [
'@app/views' => [
'@app/themes/christmas',
'@app/themes/basic',
],
]
],
],
上記の構成では、 @ app/views/site/index.php ビューファイルは、@ app/themes/christmas/site/index.phpまたは@ app/themes/basic/site/index.phpのいずれかにテーマが設定されます。 、存在するファイルに応じて。 両方のファイルが存在する場合、最初のファイルが使用されます。
ステップ7 *- *themes/christmas/site ディレクトリ構造を作成します。
- ステップ8 *-次に、themes/christmas/siteフォルダー内に、次のコードでabout.phpというファイルを作成します。
<?php
/*@var $this yii\web\View*/
use yii\helpers\Html;
$this->title = 'About';
$this->params['breadcrumbs'][] = $this->title;
$this->registerMetaTag(['name' => 'keywords', 'content' => 'yii, developing,
views, meta, tags']);
$this->registerMetaTag(['name' => 'description', 'content' => 'This is the
description of this page!'], 'description');
?>
<div class = "site-about">
<h2>Christmas theme</h2>
<img src = "http://pngimg.com/upload/fir_tree_PNG2514.png" alt = ""/>
<p style = "color: red;">
This is the About page. You may modify the following file to customize its content:
</p>
</div>
ステップ9 *- *http://localhost:8080/index.php?r = site/about にアクセスすると、クリスマステーマを使用した更新されたaboutページが表示されます。
Yii-RESTful API
YiiはRESTful APIを実装するために次の便利な機能を提供します-
- クイックプロトタイピング
- カスタマイズ可能なオブジェクトのシリアル化
- 応答形式(デフォルトでJSONおよびXMLをサポート)
- コレクションデータのフォーマットと検証エラー
- 効率的なルーティング
- HATEOASのサポート
- OPTIONSおよびHEAD動詞の組み込みサポート
- データキャッシングとHTTPキャッシング
- 認証と承認
- レート制限
動作中のRESTful APIを表示するには、データが必要です。
DBの準備
- ステップ1 *-新しいデータベースを作成します。 データベースは、次の2つの方法で準備できます。
- ターミナルで_mysql -u root –p_を実行します。
- _CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci; _を介して新しいデータベースを作成します
ステップ2 *- *config/db.php ファイルでデータベース接続を設定します。 次の構成は、現在使用されているシステム用です。
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host = localhost;dbname = helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
];
?>
ステップ3 *-ルートフォルダー内で./yii migrate/create test_table *を実行します。 このコマンドは、DBを管理するためのデータベース移行を作成します。 移行ファイルは、プロジェクトルートの *migrations フォルダーに表示されます。
ステップ4 *-この方法で移行ファイル(この場合は *m160106_163154_test_table.php )を変更します。
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160106_163154_test_table extends Migration {
public function safeUp() {
$this->createTable("user", [
"id" => Schema::TYPE_PK,
"name" => Schema::TYPE_STRING,
"email" => Schema::TYPE_STRING,
]);
$this->batchInsert("user", ["name", "email"], [
["User1", "[email protected]"],
["User2", "[email protected]"],
["User3", "[email protected]"],
["User4", "[email protected]"],
["User5", "[email protected]"],
["User6", "[email protected]"],
["User7", "[email protected]"],
["User8", "[email protected]"],
["User9", "[email protected]"],
["User10", "[email protected]"],
["User11", "[email protected]"],
]);
}
public function safeDown() {
$this->dropTable('user');
}
}
?>
上記の移行では、id、name、およびemailのフィールドを持つ user テーブルが作成されます。 また、いくつかのデモユーザーを追加します。
- ステップ5 *-プロジェクトのルート内で./yii migrate *を実行して、データベースに移行を適用します。
ステップ6 *-次に、 *user テーブルのモデルを作成する必要があります。 簡単にするために、 Gii コード生成ツールを使用します。 この url:http://localhost:8080/index.php?r = gii を開きます。 次に、「Model generator」ヘッダーの下にある「Start」ボタンをクリックします。 テーブル名(「ユーザー」)とモデルクラス(「MyUser」)を入力し、「プレビュー」ボタンをクリックして、最後に「生成」ボタンをクリックします。
MyUserモデルがモデルディレクトリに表示されます。
Postmanのインストール
Postmanは、RESTfulサービスを開発するときに便利なツールです。 要求を作成するための便利なインターフェースを提供します。
このツールはhttps://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=enで見つけることができます。
それをインストールするには、「Chromeに追加」ボタンを押してください。
Yii-動作中のRESTful API
コントローラークラスは、一般的なRESTfulアクションを実装する yii \ rest \ ActiveController クラスから拡張されます。 $ modelClass プロパティを指定して、コントローラーがデータの操作に使用するモデルを認識するようにします。
ステップ1 *-controllersフォルダー内に *UserController.php というファイルを作成します。
<?php
namespace app\controllers;
use yii\rest\ActiveController;
class UserController extends ActiveController {
public $modelClass = 'app\models\MyUser';
}
?>
次に、意味のあるHTTP動詞ときれいなURLでユーザーデータにアクセスして操作できるように、urlManagerコンポーネントを設定する必要があります。 APIがJSONのデータにアクセスできるようにするには、 request アプリケーションコンポーネントのパーサープロパティを構成する必要があります。
ステップ2 *- *config/web.php ファイルをこの方法で変更します-
<?php
$params = require(__DIR__ . '/params.php');
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
//!!! insert a secret key in the following (if it is empty) - this is
//required by cookie validation
'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
//send all mails to a file by default. You have to set
//'useFileTransport' to false and configure a transport
//for the mailer to send real emails.
'useFileTransport' => true,
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule', 'controller' => 'user'],
],
],
'request' => [
'parsers' => [
'application/json' => 'yii\web\JsonParser',
]
],
'db' => require(__DIR__ . '/db.php'),
],
'modules' => [
'hello' => [
'class' => 'app\modules\hello\Hello',
],
],
'params' => $params,
];
if (YII_ENV_DEV) {
//configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
return $config;
?>
最小限の労力で、ユーザーデータにアクセスするためのRESTful APIを構築しました。 APIには次のものがあります-
- GET/users -すべてのユーザーをページごとにリストする
- HEAD/users -ユーザーリストの概要情報を表示する
- POST/users -新しいユーザーを作成します
- GET/users/20 -ユーザーの詳細を返す20
- HEAD/users/20 -ユーザー20の概要情報を表示
- PATCH/users/20およびPUT/users/20 -ユーザー20の更新
- DELETE/users/20 -ユーザーを削除20
- *オプション/users *-エンドポイント/usersに関するサポートされている動詞を表示します
- *オプション/users/20 *-エンドポイント/users/20に関するサポートされている動詞を表示します
Yiiはコントローラー名を自動的に複数形にすることに注意してください。
ステップ3 *-次に、Postmanを開き、 *http://localhost:8080/users をパンチして、「送信」をクリックします。 以下が表示されます。
- ステップ4 *-新しいユーザーを作成するには、リクエストタイプをPOSTに変更し、名前と電子メールの2つの本文パラメーターを追加して、[送信]をクリックします。
ステップ5 *- *fields パラメーターを使用して、結果に含めるフィールドを指定できます。 たとえば、URL http://localhost:8080/users?fields = id の場合、次のスクリーンショットに示すように、nameは id および name フィールドのみを返します。
Yii-フィールド
- fields()およびextraFields()メソッドをオーバーライドすることで、応答に含めることができるデータを定義できます。 これら2つの方法の違いは、前者がデフォルトのフィールドセットを定義し、それが応答に含まれる必要がある一方で、後者が追加フィールドを定義し、エンドユーザーが *expand を介してそれらを要求した場合に応答に含まれることがあることですクエリパラメータ。
ステップ1 *-この方法で *MyUser モデルを変更します。
<?php
namespace app\models;
use app\components\UppercaseBehavior;
use Yii;
/**
*This is the model class for table "user".
* @property integer $id
*@property string $name
* @property string $email
*/
class MyUser extends \yii\db\ActiveRecord {
public function fields() {
return [
'id',
'name',
//PHP callback
'datetime' => function($model) {
return date("d:m:Y H:i:s");
}
];
}
/**
*@inheritdoc
*/
public static function tableName() {
return 'user';
}
/**
*@inheritdoc
*/
public function rules() {
return [
[[name', 'email'], 'string', 'max' => 255]
];
}
/**
*@inheritdoc
*/
public function attributeLabels() {
return [
'id' => 'ID',
'name' => 'Name',
'email' => 'Email',
];
}
}
?>
デフォルトのフィールドであるidとnameの他に、 datetime というカスタムフィールドを追加しました。
ステップ2 *-Postmanで、URL *http://localhost:8080/users を実行します。
ステップ3 *-次に、 *MyUser モデルをこの方法で変更します。
<?php
namespace app\models;
use app\components\UppercaseBehavior;
use Yii;
/**
*This is the model class for table "user".
*
*@property integer $id
* @property string $name
*@property string $email
*/
class MyUser extends \yii\db\ActiveRecord {
public function fields() {
return [
'id',
'name',
];
}
public function extraFields() {
return ['email'];
}
/**
*@inheritdoc
*/
public static function tableName() {
return 'user';
}
/**
*@inheritdoc
*/
public function rules() {
return [
[[name', 'email'], 'string', 'max' => 255]
];
}
/**
*@inheritdoc
*/
public function attributeLabels() {
return [
'id' => 'ID',
'name' => 'Name',
'email' => 'Email',
];
}
}
?>
電子メールフィールドは* extraFields()*メソッドによって返されることに注意してください。
ステップ4 *-このフィールドでデータを取得するには、 *http://localhost:8080/users?expand = email を実行します。
アクションのカスタマイズ
*yii \ rest \ ActiveController* クラスは以下のアクションを提供します-
- インデックス-リソースをページごとにリストします
- 表示-指定されたリソースの詳細を返します
- 作成-新しいリソースを作成します
- 更新-既存のリソースを更新します
- 削除-指定されたリソースを削除します
- オプション-サポートされているHTTPメソッドを返します
上記のすべてのアクションは、actions method()で宣言されます。
「削除」および「作成」アクションを無効にするには、 UserController をこのように変更します-
<?php
namespace app\controllers;
use yii\rest\ActiveController;
class UserController extends ActiveController {
public $modelClass = 'app\models\MyUser';
public function actions() {
$actions = parent::actions();
//disable the "delete" and "create" actions
unset($actions['delete'], $actions['create']);
return $actions;
}
}
?>
エラー処理
RESTful APIリクエストを取得する際に、リクエストにエラーがあるか、サーバーで予期しないことが発生した場合、単純に例外をスローできます。 エラーの原因を特定できる場合は、適切なHTTPステータスコードとともに例外をスローする必要があります。 Yii RESTは次のステータスを使用します-
- 200 -OK。
- 201 -リソースはPOST要求への応答で正常に作成されました。 Locationヘッダーには、新しく作成されたリソースを指すURLが含まれています。
- 204 -要求は正常に処理され、応答にはコンテンツが含まれていません。
- 304 -リソースは変更されませんでした。
- 400 -不正なリクエスト。
- 401 -認証に失敗しました。
- 403 -認証されたユーザーは、指定されたAPIエンドポイントへのアクセスを許可されていません。
- 404 -リソースが存在しません。
- 405 -メソッドは許可されていません。
- 415 -サポートされていないメディアタイプ。
- 422 -データの検証に失敗しました。
- 429 -リクエストが多すぎます。
- 500 -内部サーバーエラー。
Yii-テスト
PHPクラスを作成するときは、ステップごとにデバッグするか、dieまたはechoステートメントを使用して動作を確認します。 Webアプリケーションを開発する場合、フォームにテストデータを入力して、ページが期待どおりに機能することを確認します。 このテストプロセスは自動化できます。
自動テストアプローチは、長期プロジェクトに適しています。
- 複雑で大きい
- 絶えず成長する
- 失敗のコストの点で高すぎる
プロジェクトが複雑にならず、比較的単純であるか、1回限りのプロジェクトである場合、自動化されたテストはやり過ぎになる可能性があります。
テストの準備
- ステップ1 *-Codeceptionフレームワークをインストールします。 次のコードを実行します。
composer global require "codeception/codeception = 2.0.*"
composer global require "codeception/specify = *"
composer global require "codeception/verify = *"
- ステップ2 *-次を実行します。
composer global status
出力は、「現在のディレクトリを<ディレクトリ>に変更」です。 PATH変数に「<ディレクトリ>/vendor/bin」を追加する必要があります。 この場合、次のコードを実行します-
export PATH = $PATH:~/.composer/vendor/bin
ステップ3 *- *'yii2_basic_tests' という新しいデータベースを作成します。
- ステップ4 *-テストディレクトリ内で実行します。
codeception/bin/yii migrate
データベース構成は tests/codeception/config/config.php にあります。
- ステップ5 *-テストスイートをビルドします。
codecept build
備品
フィクスチャの主な目的は、予期しない方法でテストが実行されるように、未知の状態で環境をセットアップすることです。 Yiiは、ニアフィクスチャフレームワークを提供します。 Yiiフィクスチャフレームワークの重要な概念はフィクスチャオブジェクトです。 テスト環境の特定の側面を表します。 フィクスチャオブジェクトは、* yii \ test \ Fixtureクラス*のインスタンスです。
フィクスチャを定義するには、新しいクラスを作成し、yii \ test \ Fixtureまたはyii \ test \ ActiveFixtureから拡張する必要があります。 前者は汎用フィクスチャに適していますが、後者はデータベースとActiveRecordで動作するように特別に設計されています。
単体テスト
単体テストは、個々の機能のテストに役立ちます。 たとえば、モデル関数またはコンポーネントクラス。
ステップ1 *- *tests/codeception/fixtures ディレクトリの下の ExampleFixture.php というファイルに新しいフィクスチャを作成します。
<?php
namespace app\tests\codeception\fixtures;
use yii\test\ActiveFixture;
class ExampleFixture extends ActiveFixture {
public $modelClass = ‘app⊨’MyUser';
}
?>
- ステップ2 *-次に、tests/codeception/unit/modelsフォルダーにExampleTest.phpという新しいテストファイルを作成します。
<?php
namespace tests\codeception\unit\models;
use app\models\MyUser;
use yii\codeception\TestCase;
class ExampleTest extends TestCase {
public function testCreateMyUser() {
$m = new MyUser();
$m->name = "myuser";
$m->email = "[email protected]";
$this->assertTrue($m->save());
}
public function testUpdateMyUser() {
$m = new MyUser();
$m->name = "myuser2";
$m->email = "[email protected]";
$this->assertTrue($m->save());
$this->assertEquals("myuser2", $m->name);
}
public function testDeleteMyUser() {
$m = MyUser::findOne(['name' => 'myuser2']);
$this->assertNotNull($m);
MyUser::deleteAll(['name' => $m->name]);
$m = MyUser::findOne(['name' => 'myuser2']);
$this->assertNull($m);
}
}
?>
上記のコードでは、3つのテストを定義します-
- testCreateMyUser、
- testUpdateMyUser、および *testDeleteMyUser。
新しいユーザーを作成し、名前を更新して、削除しようとしました。* MyUser *モデルは、実際のDBの完全なコピーであるyii2_basic_testsデータベースの観点から管理します。
ステップ3 *- *tests を開始するには、testsフォルダーに移動して実行します。
codecept run unit models/ExampleTest
すべてのテストに合格する必要があります。 次が表示されます-
機能テスト
機能テストはあなたを助ける-
- ブラウザエミュレータを使用してアプリケーションをテストする
- 関数が適切に動作することを確認します
- データベースと対話する
- サーバー側のスクリプトにデータを送信する
テストフォルダ内で実行-
generate:cept functional AboutPageCept
上記のコマンドは、tests/codeception/functionalフォルダーの下に AboutPageCept.php ファイルを作成します。 この機能テストでは、 about ページが存在するかどうかを確認します。
ステップ1 *- *AboutPageCept.php ファイルを変更します。
<?php
$I = new FunctionalTester($scenario);
$I->wantTo('perform actions and see result');
$I->amOnPage('site/about');
$I->see('about');
$I->dontSee('apple');
?>
上記のコードでは、aboutページにいるかどうかを確認しました。 明らかに、ページには「about」という単語が表示され、「apple」は表示されません。
- ステップ2 *-テストを実行します。
run functional AboutPageCept
次の出力が表示されます-
Yii-キャッシング
キャッシングは、アプリケーションのパフォーマンスを向上させる効果的な方法です。 キャッシュメカニズムは、静的データをキャッシュに保存し、要求されたときにキャッシュから取得します。 サーバー側では、キャッシュを使用して、最新のニュースのリストなどの基本データを保存できます。 ページフラグメントまたはWebページ全体を保存することもできます。 クライアント側では、HTTPキャッシュを使用して、最近アクセスしたページをブラウザーキャッシュに保持できます。
DBの準備
- ステップ1 *-新しいデータベースを作成します。 データベースは、次の2つの方法で準備できます。
- ターミナルで_mysql -u root –p_を実行します
. * _CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci; _を介して新しいデータベースを作成します
ステップ2 *- *config/db.php ファイルでデータベース接続を設定します。 次の構成は、現在使用されているシステム用です。
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
];
?>
ステップ3 *-ルートフォルダー内で./yii migrate/create test_table *を実行します。 このコマンドは、DBを管理するためのデータベース移行を作成します。 移行ファイルは、プロジェクトルートの *migrations フォルダーに表示されます。
ステップ4 *-この方法で移行ファイル(この場合は *m160106_163154_test_table.php )を変更します。
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160106_163154_test_table extends Migration {
public function safeUp()\ {
$this->createTable("user", [
"id" => Schema::TYPE_PK,
"name" => Schema::TYPE_STRING,
"email" => Schema::TYPE_STRING,
]);
$this->batchInsert("user", ["name", "email"], [
["User1", "[email protected]"],
["User2", "[email protected]"],
["User3", "[email protected]"],
["User4", "[email protected]"],
["User5", "[email protected]"],
["User6", "[email protected]"],
["User7", "[email protected]"],
["User8", "[email protected]"],
["User9", "[email protected]"],
["User10", "[email protected]"],
["User11", "[email protected]"],
]);
}
public function safeDown() {
$this->dropTable('user');
}
}
?>
上記の移行では、id、name、およびemailのフィールドを持つ user テーブルが作成されます。 また、いくつかのデモユーザーを追加します。
- ステップ5 *-プロジェクトのルート内で./yii migrate *を実行して、データベースに移行を適用します。
ステップ6 *-次に、 *user テーブルのモデルを作成する必要があります。 簡単にするために、 Gii コード生成ツールを使用します。 この url:http://localhost:8080/index.php?r = gii を開きます。 次に、「Model generator」ヘッダーの下にある「Start」ボタンをクリックします。 テーブル名(「ユーザー」)とモデルクラス(「MyUser」)を入力し、「プレビュー」ボタンをクリックして、最後に「生成」ボタンをクリックします。
MyUserモデルがモデルディレクトリに表示されます。
データキャッシング
- データキャッシングは、PHP変数をキャッシュに保存し、後で取得するのに役立ちます。 データキャッシングは、通常はアプリケーションコンポーネントとして登録されるキャッシュコンポーネントに依存しています。 アプリケーションコンポーネントにアクセスするには、 *Yii
- $ app→cache* を呼び出します。 複数のキャッシュアプリケーションコンポーネントを登録できます。
Yiiは次のキャッシュストレージをサポートしています-
- yii \ caching \ DbCache-データベーステーブルを使用して、キャッシュされたデータを保存します。 Uouは、yii \ caching \ DbCache :: $ cacheTableで指定されたテーブルを作成する必要があります。
- yii \ caching \ ApcCache-PHP APC拡張を使用します。
- yii \ caching \ FileCache-ファイルを使用してキャッシュされたデータを保存します。
- yii \ caching \ DummyCache-実際のキャッシングを行わないキャッシュプレースホルダーとして機能します。 このコンポーネントの目的は、キャッシュの可用性を確認する必要があるコードを簡素化することです。
- yii \ caching \ MemCache-PHP memcache拡張を使用します。
- yii \ caching \ WinCache-PHP WinCache拡張機能を使用します。
- yii \ redis \ Cache-Redisデータベースに基づいてキャッシュコンポーネントを実装します。
- yii \ caching \ XCache-PHP XCache拡張を使用します。
すべてのキャッシュコンポーネントは、次のAPIをサポートしています-
- get()-指定されたキーでキャッシュからデータ値を取得します。 データ値が期限切れ/無効化されているか、見つからない場合は、偽の値が返されます。
- add()-キーがキャッシュ内に見つからない場合、キーによって識別されるデータ値をキャッシュに保存します。
- set()-キーで識別されるデータ値をキャッシュに保存します。
- multiGet()-指定されたキーでキャッシュから複数のデータ値を取得します。
- multiAdd()-複数のデータ値をキャッシュに保存します。 各アイテムはキーで識別されます。 キーがキャッシュに既に存在する場合、データ値はスキップされます。
- multiSet()-複数のデータ値をキャッシュに保存します。 各アイテムはキーで識別されます。
- exists()-指定されたキーがキャッシュで見つかったかどうかを示す値を返します。
- flush()-すべてのデータ値をキャッシュから削除します。
- delete()-キーから識別されたデータ値をキャッシュから削除します。
キャッシュに保存されたデータ値は、削除されない限り永久に残ります。 この動作を変更するには、set()メソッドを呼び出してデータ値を保存するときに有効期限パラメーターを設定します。
キャッシュされたデータ値は、*キャッシュの依存関係*の変更により無効化されることもあります
- yii \ caching \ DbDependency-指定されたSQLステートメントのクエリ結果が変更されると、依存関係が変更されます。
- yii \ caching \ ChainedDependency-チェーンの依存関係のいずれかが変更されると、依存関係が変更されます。
- yii \ caching \ FileDependency-ファイルの最終変更時刻が変更されると、依存関係が変更されます。
- yii \ caching \ ExpressionDependency-指定されたPHP式の結果が変更されると、依存関係が変更されます。
ここで、 cache アプリケーションコンポーネントをアプリケーションに追加します。
ステップ1 *- *config/web.php ファイルを変更します。
<?php
$params = require(__DIR__ . '/params.php');
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
//!!! insert a secret key in the following (if it is empty) - this
//is required by cookie validation
'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
//send all mails to a file by default. You have to set
//'useFileTransport' to false and configure a transport
//for the mailer to send real emails.
'useFileTransport' => true,
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'db' => require(__DIR__ . '/db.php'),
],
'modules' => [
'hello' => [
'class' => 'app\modules\hello\Hello',
],
],
'params' => $params,
];
if (YII_ENV_DEV) {
//configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
return $config;
?>
ステップ2 *- actionTestCache()*という新しい関数をSiteControllerに追加します。
public function actionTestCache() {
$cache = Yii::$app->cache;
//try retrieving $data from cache
$data = $cache->get("my_cached_data");
if ($data === false) {
//$data is not found in cache, calculate it from scratch
$data = date("d.m.Y H:i:s");
//store $data in cache so that it can be retrieved next time
$cache->set("my_cached_data", $data, 30);
}
//$data is available here
var_dump($data);
}
ステップ3 *-Webブラウザーのアドレスバーに *http://localhost:8080/index.php?r = site/test-cache と入力すると、次のように表示されます。
- ステップ4 *-ページをリロードすると、日付が変更されていないことに気付くはずです。 日付値はキャッシュされ、キャッシュは30秒以内に期限切れになります。 30秒後にページをリロードします。
クエリキャッシング
クエリキャッシングは、データベースクエリの結果をキャッシュします。 クエリキャッシングには、DB接続とキャッシュアプリケーションコンポーネントが必要です。
ステップ1 *- actionQueryCaching()*という新しいメソッドをSiteControllerに追加します。
public function actionQueryCaching() {
$duration = 10;
$result = MyUser::getDb()->cache(function ($db) {
return MyUser::find()->count();
}, $duration);
var_dump($result);
$user = new MyUser();
$user->name = "cached user name";
$user->email = "[email protected]";
$user->save();
echo "==========";
var_dump(MyUser::find()->count());
}
上記のコードでは、データベースクエリをキャッシュし、新しいユーザーを追加して、ユーザーカウントを表示します。
ステップ2 *-URL *http://localhost:8080/index.php?r = site/query-caching にアクセスして、ページをリロードします。
最初のページを開くと、DBクエリをキャッシュし、すべてのユーザーカウントを表示します。 ページをリロードすると、データベースクエリがキャッシュされるため、キャッシュされたDBクエリの結果は同じです。
次のコマンドを使用して、コンソールからキャッシュをフラッシュできます-
- yii cache -利用可能なキャッシュコンポーネントを表示します。
- yii cache/flush cache1 cache2 cache3 -キャッシュコンポーネントcache1、cache2、cache3をフラッシュします。
- yii cache/flush-all -すべてのキャッシュコンポーネントをフラッシュします。
ステップ3 *-アプリケーションのプロジェクトルート内で。/yii cache/flush-all *を実行します。
Yii-フラグメントキャッシング
フラグメントキャッシングは、Webページのフラグメントのキャッシングを提供します。
ステップ1 *- actionFragmentCaching()*という新しい関数をSiteControllerに追加します。
public function actionFragmentCaching() {
$user = new MyUser();
$user->name = "cached user name";
$user->email = "[email protected]";
$user->save();
$models = MyUser::find()->all();
return $this->render('cachedview', ['models' => $models]);
}
上記のコードでは、新しいユーザーを作成し、 cachedview ビューファイルを表示しました。
ステップ2 *-次に、 *views/site フォルダーに cachedview.php という新しいファイルを作成します。
<?php if ($this->beginCache('cachedview')) { ?>
<?php foreach ($models as $model): ?>
<?= $model->id; ?>
<?= $model->name; ?>
<?= $model->email; ?>
<br/>
<?php endforeach; ?>
<?php $this->endCache(); } ?>
<?php echo "Count:", \app\models\MyUser::find()->count(); ?>
コンテンツ生成ロジックをbeginCache()およびendCache()メソッドのペアで囲みました。 コンテンツがキャッシュで見つかった場合、beginCache()メソッドはそれをレンダリングします。
ステップ3 *-URL *http://localhost:8080/index.php?r = site/fragment-caching にアクセスして、ページをリロードします。 出力は次のようになります。
beginCache()メソッドとendCache()メソッドの間のコンテンツがキャッシュされることに注意してください。 データベースには13人のユーザーがいますが、表示されるのは12人だけです。
ページキャッシュ
ページキャッシュは、Webページ全体のコンテンツのキャッシュを提供します。 ページキャッシュは yii \ filter \ PageCache でサポートされています。
ステップ1 *-SiteControllerの behaviors()*関数を変更します。
public function behaviors() {
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['logout'],
'rules' => [
[
'actions' => ['logout'],
'allow' => true,
'roles' => ['@'],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'logout' => ['post'],
],
],
[
'class' => 'yii\filters\PageCache',
'only' => ['index'],
'duration' => 60
],
];
}
上記のコードは、インデックスページを60秒間キャッシュします。
ステップ2 *-URL *http://localhost:8080/index.php?r = site/index に移動します。 次に、インデックスビューファイルのお祝いメッセージを変更します。 ページをリロードしても、ページはキャッシュされているため、変更はありません。 しばらく待ってから、ページを再度リロードしてください。
HTTPキャッシング
Webアプリケーションでは、クライアント側のキャッシュも使用できます。 これを使用するには、コントローラーアクションの yii \ filter \ HttpCache フィルターを構成します。
Last-Modifiedヘッダーはタイムスタンプを使用して、ページが変更されたかどうかを示します。
- *ステップ1 *-Last-Modifiedヘッダーの送信を有効にするには、yii \ filter \ HttpCache
- $ lastModifiedプロパティを設定します。
public function behaviors() {
return [
[
'class' => 'yii\filters\HttpCache',
'only' => ['index'],
'lastModified' => function ($action, $params) {
$q = new \yii\db\Query();
return $q->from('news')->max('created_at');
},
],
];
}
上記のコードでは、インデックスページに対してのみHTTPキャッシュを有効にしました。 ブラウザーが初めてインデックスページを開くと、サーバー側でページが生成され、ブラウザーに送信されます。 2回目は、ニュースが作成されない場合、サーバーはページを再生成しません。
Etagヘッダーは、ページのコンテンツを表すハッシュを提供します。 ページが変更されると、ハッシュも変更されます。
- *ステップ2 *-Etagヘッダーの送信を有効にするには、 *yii \ filters \ HttpCache
- $ etagSeed* プロパティを設定します。
public function behaviors() {
return [
[
'class' => 'yii\filters\HttpCache',
'only' => ['index'],
'etagSeed' => function ($action, $params) {
$user = $this->findModel(\Yii::$app->request->get('id'));
return serialize([$user->name, $user->email]);
},
],
];
}
上記のコードでは、 index アクションに対してのみHTTPキャッシュを有効にしました。 ユーザーの名前と電子メールに基づいてEtag HTTPヘッダーを生成する必要があります。 ブラウザーが初めてインデックスページを開くと、サーバー側でページが生成され、ブラウザーに送信されます。 2回目は、名前または電子メールに変更がない場合、サーバーはページを再生成しません。
Yii-エイリアス
エイリアスは、プロジェクト内の絶対パスまたはURLをハードコーディングしないようにするのに役立ちます。 エイリアスは@文字で始まります。
- エイリアスを定義するには、* Yii
- setAlias()*メソッドを呼び出す必要があります-
//an alias of a file path
Yii::setAlias('@alias', '/path/to/alias');
//an alias of a URL
Yii::setAlias('@urlAlias', 'http://www.google.com');
また、既存のエイリアスから新しいエイリアスを派生させることもできます-
Yii::setAlias('@pathToSomewhere', '@alias/path/to/somewhere');
- あなたは、エントリスクリプトまたはアプリケーション構成のエイリアスと呼ばれる書き込み可能なプロパティでYii
- setAlias()メソッドを呼び出すことができます-
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'aliases' => [
'@alias' => '/path/to/somewhere',
'@urlAlias' => 'http://www.google.com',
],
//other components...
]
]
- エイリアスを解決するには、Yii
- getAlias()メソッドを呼び出す必要があります。
Yiiは次のエイリアスを事前定義します-
- @ app -アプリケーションのベースパス。
- @ yii -BaseYii.phpファイルがあるフォルダー。
- @ webroot -アプリケーションのWebルートディレクトリ。
- @ web -アプリケーションのベースURL。
- @ runtime -アプリケーションのランタイムパス。 デフォルトは@ app/runtimeです。
- @ vendor -Composerベンダーディレクトリ。 デフォルトは@ app/vendorです。
- @ npm -npmパッケージのルートディレクトリ。 デフォルトは@ vendor/npmです。
- @ bower -bowerパッケージのルートディレクトリ。 デフォルトは@ vendor/bowerです。
さて、_actionAliases()_という新しい関数をSiteControllerに追加します-
public function actionAliases() {
Yii::setAlias("@components", "@app/components");
Yii::setAlias("@imagesUrl", "@web/images");
var_dump(Yii::getAlias("@components"));
var_dump(Yii::getAlias("@imagesUrl"));
}
上記のコードでは、2つのエイリアスを作成しました。アプリケーションコンポーネントの@componentsと、すべてのアプリケーションイメージを保存したURLの@imagesUrlです。
http://localhost:8080/index.php?r = site/aliasesと入力すると、次の出力が表示されます-
Yii-ロギング
Yiiは、高度にカスタマイズ可能で拡張可能なフレームワークを提供します。 このフレームワークを使用すると、さまざまなタイプのメッセージを簡単に記録できます。
メッセージを記録するには、次の方法のいずれかを呼び出す必要があります-
- * Yii :: error()*-致命的なエラーメッセージを記録します。
- * Yii :: warning()*-警告メッセージを記録します。
- * Yii :: info()*-いくつかの有用な情報を含むメッセージを記録します。
- * Yii :: trace()*-メッセージを記録して、コードの実行方法を追跡します。
上記のメソッドは、さまざまなカテゴリでログメッセージを記録します。 彼らは次の関数シグネチャを共有します-
function ($message, $category = 'application')
ここで-
- $ message -記録されるログメッセージ
- $ category -ログメッセージのカテゴリ
命名スキームの簡単で便利な方法は、PHP METHODマジック定数を使用することです。 たとえば-
Yii::info('this is a log message', __METHOD__);
ログターゲットは、yii \ log \ Targetクラスのインスタンスです。 すべてのログメッセージをカテゴリ別にフィルタリングし、ファイル、データベース、または電子メールにエクスポートします。
- ステップ1 *-複数のログターゲットも同様に登録できます。
return [
//the "log" component is loaded during bootstrapping time
'bootstrap' => ['log'],
'components' => [
'log' => [
'targets' => [
[
'class' => 'yii\log\DbTarget',
'levels' => ['error', 'warning', 'trace', 'info'],
],
[
'class' => 'yii\log\EmailTarget',
'levels' => ['error', 'warning'],
'categories' => ['yii\db\*'],
'message' => [
'from' => ['[email protected]'],
'to' => ['[email protected]', '[email protected]'],
'subject' => 'Application errors at mydomain.com',
],
],
],
],
],
];
上記のコードでは、2つのターゲットが登録されています。 最初のターゲットは、すべてのエラー、警告、トレース、および情報メッセージを選択し、データベースに保存します。 2番目のターゲットは、すべてのエラーおよび警告メッセージを管理者の電子メールに送信します。
Yiiは次の組み込みログターゲットを提供します-
- yii \ log \ DbTarget -ログメッセージをデータベースに保存します。
- yii \ log \ FileTarget -ログメッセージをファイルに保存します。
- yii \ log \ EmailTarget -定義済みの電子メールアドレスにログメッセージを送信します。
- yii \ log \ SyslogTarget -PHPを呼び出してログメッセージをsyslogに保存します 関数syslog()。
デフォルトでは、ログメッセージは次のようにフォーマットされています-
Timestamp [IP address][User ID][Session ID][Severity Level][Category] Message Text
- *ステップ2 *-この形式をカスタマイズするには、 *yii \ log \ Target
- $ prefix* プロパティを設定する必要があります。 例えば。
[
'class' => 'yii\log\FileTarget',
'prefix' => function ($message) {
$user = Yii::$app->has('user', true) ? Yii::$app->get('user') :
'undefined user';
$userID = $user ? $user->getId(false) : 'anonym';
return "[$userID]";
}
]
上記のコードスニペットは、すべてのログメッセージの前に現在のユーザーIDを付けるようにログターゲットを構成します。
- デフォルトでは、ログメッセージには、これらのグローバルPHP変数$ _GET、$ _ POST、$ _ SESSION、$ _ COOKIE、$ _ FILES、および$ _SERVERの値が含まれます。 この動作を変更するには、含める変数の名前で *yii \ log \ Target
- $ logVars* プロパティを構成する必要があります。
すべてのログメッセージは、ロガーオブジェクトによって配列に保持されます。 ロガーオブジェクトは、配列が特定の数のメッセージ(デフォルトは1000)を蓄積するたびに、記録されたメッセージをログターゲットにフラッシュしました。
ステップ3 *-この数値をカスタマイズするには、 flushIntervalプロパティ*を呼び出す必要があります。
return [
'bootstrap' => ['log'],
'components' => [
'log' => [
'flushInterval' => 50,//default is 1000
'targets' => [...],
],
],
];
ロガーオブジェクトがログメッセージをログターゲットにフラッシュしても、それらはすぐにはエクスポートされません。 エクスポートは、ログターゲットが特定の数のメッセージを蓄積するときに発生します(デフォルトは1000)。
ステップ4 *-この数値をカスタマイズするには、 *exportInterval プロパティを構成する必要があります。
[
'class' => 'yii\log\FileTarget',
'exportInterval' => 50,//default is 1000
]
ステップ5 *-次に、 *config/web.php ファイルをこの方法で変更します。
<?php
$params = require(__DIR__ . '/params.php');
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
//!!! insert a secret key in the following (if it is empty) - this
//is required by cookie validation
'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
//send all mails to a file by default. You have to set
//'useFileTransport' to false and configure a transport
//for the mailer to send real emails.
'useFileTransport' => true,
],
'log' => [
'flushInterval' => 1,
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'exportInterval' => 1,
'logVars' => []
],
],
],
'db' => require(__DIR__ . '/db.php'),
],
'modules' => [
'hello' => [
'class' => 'app\modules\hello\Hello',
],
],
'params' => $params,
];
if (YII_ENV_DEV) {
//configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
return $config;
?>
上記のコードでは、ログアプリケーションコンポーネントを定義し、 flushInterval および exportInteval プロパティを1に設定して、すべてのログメッセージがログファイルにすぐに表示されるようにします。 また、ログターゲットのレベルプロパティも省略します。 つまり、すべてのカテゴリ(エラー、警告、情報、トレース)のログメッセージがログファイルに表示されます。
- ステップ6 *-次に、SiteControllerでactionLog()という関数を作成します。
public function actionLog() {
Yii::trace('trace log message');
Yii::info('info log message');
Yii::warning('warning log message');
Yii::error('error log message');
}
上記のコードでは、異なるカテゴリの4つのログメッセージをログファイルに書き込むだけです。
ステップ7 *-WebブラウザーのアドレスバーにURL *http://localhost:8080/index.php?r = site/log を入力します。 ログメッセージは、app.logファイルのapp/runtime/logsディレクトリに表示されます。
Yii-エラー処理
Yiiには組み込みのエラーハンドラが含まれています。 Yiiエラーハンドラは次のことを行います-
- 致命的でないすべてのPHPエラーをキャッチ可能な例外に変換します。
- すべてのエラーと例外を詳細なコールスタックとともに表示します。
- さまざまなエラー形式をサポートします。
- コントローラアクションを使用してエラーを表示することをサポートします。
エラーハンドラを無効にするには、エントリスクリプトでYII_ENABLE_ERROR_HANDLER定数をfalseに定義する必要があります。 エラーハンドラは、アプリケーションコンポーネントとして登録されます。
- ステップ1 *-次の方法で構成できます。
return [
'components' => [
'errorHandler' => [
'maxSourceLines' => 10,
],
],
];
上記の構成では、表示されるソースコードの行数が10に設定されます。 エラーハンドラは、致命的でないすべてのPHPエラーをキャッチ可能な例外に変換します。
ステップ2 *- actionShowError()*という新しい関数をSiteControllerに追加します。
public function actionShowError() {
try {
5/0;
} catch (ErrorException $e) {
Yii::warning("Ooops...division by zero.");
}
//execution continues...
}
ステップ3 *-URL *http://localhost:8080/index.php?r = site/show-error に移動します。 警告メッセージが表示されます。
ユーザーにリクエストが無効であることを表示したい場合は、 yii \ web \ NotFoundHttpException をスローできます。
ステップ4 *- actionShowError()*関数を変更します。
public function actionShowError() {
throw new NotFoundHttpException("Something unexpected happened");
}
ステップ5 *-アドレスバーにアドレス *http://localhost:8080/index.php?r = site/show-error を入力します。 次のHTTPエラーが表示されます。
YII_DEBUG定数がtrueの場合、エラーハンドラーは詳細な呼び出しスタックでエラーを表示します。 定数がfalseの場合、エラーメッセージのみが表示されます。 デフォルトでは、エラーハンドラはこれらのビューを使用してエラーを表示します-
- @yii/views/errorHandler/exception.php-コールスタック情報とともにエラーを表示する必要がある場合、ビューファイルが使用されます。
- @yii/views/errorHandler/error.php-呼び出しスタック情報なしでエラーを表示する必要がある場合に、ビューファイルが使用されます。
専用のエラーアクションを使用して、エラー表示をカスタマイズできます。
ステップ6 *- *config/web.php ファイルの errorHandler アプリケーションコンポーネントを変更します。
<?php
$params = require(__DIR__ . '/params.php');
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
//!!! insert a secret key in the following (if it is empty) - this
//is required by cookie validation
'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [
'errorAction' => 'site/error',
],
//other components...
'db' => require(__DIR__ . '/db.php'),
],
'modules' => [
'hello' => [
'class' => 'app\modules\hello\Hello',
],
],
'params' => $params,
];
if (YII_ENV_DEV) {
//configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
return $config;
?>
上記の構成は、呼び出しスタックなしでエラーを表示する必要がある場合、 site/error アクションが実行されることを定義しています。
ステップ7 *-SiteControllerの actions()*メソッドを変更します。
public function actions() {
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
];
}
上記のコードは、*エラー*が発生すると、エラービューがレンダリングされることを定義しています。
ステップ8 *-views/siteディレクトリの下に *error.php というファイルを作成します。
<?php
/*@var $this yii\web\View*/
/*@var $name string*/
/*@var $message string*/
/*@var $exception Exception*/
use yii\helpers\Html;
$this->title = $name;
?>
<div class = "site-error">
<h2>customized error</h2>
<h1><?= Html::encode($this->title) ?></h1>
<div class = "alert alert-danger">
<?= nl2br(Html::encode($message)) ?>
</div>
<p>
The above error occurred while the Web server was processing your request.
</p>
<p>
Please contact us if you think this is a server error. Thank you.
</p>
</div>
ステップ9 *-アドレス *http://localhost:8080/index.php?r = site/show-error に移動すると、カスタマイズされたエラービューが表示されます。
Yii-認証
ユーザーの身元を確認するプロセスは「認証」と呼ばれます。 通常、ユーザー名とパスワードを使用して、ユーザーが主張するユーザーであるかどうかを判断します。
Yii認証フレームワークを使用するには、次のことが必要です-
- ユーザーアプリケーションコンポーネントを構成します。
- yii \ web \ IdentityInterfaceインターフェースを実装します。
基本的なアプリケーションテンプレートには、認証システムが組み込まれています。 次のコードに示すように、ユーザーアプリケーションコンポーネントを使用します-
<?php
$params = require(__DIR__ . '/params.php');
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
//!!! insert a secret key in the following (if it is empty) - this
//is required by cookie validation
'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
//other components...
'db' => require(__DIR__ . '/db.php'),
],
'modules' => [
'hello' => [
'class' => 'app\modules\hello\Hello',
],
],
'params' => $params,
];
if (YII_ENV_DEV) {
//configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
return $config;
?>
上記の構成では、ユーザーのIDクラスはapp \ models \ Userに構成されています。
IDクラスは、次のメソッドで yii \ web \ IdentityInterface を実装する必要があります-
- * findIdentity()*-指定されたユーザーIDを使用してIDクラスのインスタンスを検索します。
- * findIdentityByAccessToken()*-指定されたアクセストークンを使用してIDクラスのインスタンスを検索します。
- * getId()*-ユーザーのIDを返します。
- * getAuthKey()*-Cookieベースのログインの検証に使用されるキーを返します。
- * validateAuthKey()*-Cookieベースのログインキーを検証するためのロジックを実装します。
基本的なアプリケーションテンプレートのユーザーモデルは、上記のすべての機能を実装します。 ユーザーデータは $ users プロパティに保存されます-
<?php
namespace app\models;
class User extends \yii\base\Object implements \yii\web\IdentityInterface {
public $id;
public $username;
public $password;
public $authKey;
public $accessToken;
private static $users = [
'100' => [
'id' => '100',
'username' => 'admin',
'password' => 'admin',
'authKey' => 'test100key',
'accessToken' => '100-token',
],
'101' => [
'id' => '101',
'username' => 'demo',
'password' => 'demo',
'authKey' => 'test101key',
'accessToken' => '101-token',
],
];
/**
*@inheritdoc
*/
public static function findIdentity($id) {
return isset(self::$users[$id]) ? new static(self::$users[$id]) : null;
}
/**
*@inheritdoc
*/
public static function findIdentityByAccessToken($token, $type = null) {
foreach (self::$users as $user) {
if ($user['accessToken'] === $token) {
return new static($user);
}
}
return null;
}
/**
*Finds user by username
*
*@param string $username
* @return static|null
*/
public static function findByUsername($username) {
foreach (self::$users as $user) {
if (strcasecmp($user['username'], $username) === 0) {
return new static($user);
}
}
return null;
}
/**
*@inheritdoc
*/
public function getId() {
return $this->id;
}
/**
*@inheritdoc
*/
public function getAuthKey() {
return $this->authKey;
}
/**
*@inheritdoc
*/
public function validateAuthKey($authKey) {
return $this->authKey === $authKey;
}
/**
*Validates password
*
*@param string $password password to validate
* @return boolean if password provided is valid for current user
*/
public function validatePassword($password) {
return $this->password === $password;
}
}
?>
ステップ1 *-URL *http://localhost:8080/index.php?r = site/login にアクセスし、ログインとパスワードにadminを使用してWebサイトにログインします。
ステップ2 *-次に、 actionAuth()*という新しい関数をSiteControllerに追加します。
public function actionAuth(){
//the current user identity. Null if the user is not authenticated.
$identity = Yii::$app->user->identity;
var_dump($identity);
//the ID of the current user. Null if the user not authenticated.
$id = Yii::$app->user->id;
var_dump($id);
//whether the current user is a guest (not authenticated)
$isGuest = Yii::$app->user->isGuest;
var_dump($isGuest);
}
ステップ3 *-Webブラウザにアドレス *http://localhost:8080/index.php?r = site/auth を入力すると、 admin ユーザーに関する詳細情報が表示されます。
- ステップ4 *-ユーザーをログインしてロゴを作成するには、次のコードを使用できます。
public function actionAuth() {
//whether the current user is a guest (not authenticated)
var_dump(Yii::$app->user->isGuest);
//find a user identity with the specified username.
//note that you may want to check the password if needed
$identity = User::findByUsername("admin");
//logs in the user
Yii::$app->user->login($identity);
//whether the current user is a guest (not authenticated)
var_dump(Yii::$app->user->isGuest);
Yii::$app->user->logout();
//whether the current user is a guest (not authenticated)
var_dump(Yii::$app->user->isGuest);
}
- 最初に、ユーザーがログインしているかどうかを確認します。 値が false を返す場合、* Yii
- $ app→user→login()呼び出しを介してユーザーをログインし、 Yii :: $ app→user→logout()*を使用してログアウトします方法。
ステップ5 *-URL *http://localhost:8080/index.php?r = site/auth にアクセスすると、次のように表示されます。
*yii \ web \ User* クラスは、次のイベントを発生させます-
- EVENT_BEFORE_LOGIN -_yii \ web \ User :: login()_の先頭で発生
- EVENT_AFTER_LOGIN -ログイン成功後に発生
- EVENT_BEFORE_LOGOUT -_yii \ web \ User :: logout()_の先頭で発生
- EVENT_AFTER_LOGOUT -ログアウト成功後に発生
Yii-認証
ユーザーが何かをするのに十分な権限を持っていることを確認するプロセスは、承認*と呼ばれます。 Yiiは、 *yii \ filters \ AccessControl として実装された認証方法であるACF(アクセス制御フィルター)を提供します。 SiteControllerのbehaviors()関数を変更します-
public function behaviors() {
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['about', 'contact'],
'rules' => [
[
'allow' => true,
'actions' => ['about'],
'roles' => ['?'],
],
[
'allow' => true,
'actions' => ['contact', 'about'],
'roles' => ['@'],
],
],
],
];
}
上記のコードでは、ACFが動作として添付されています。 唯一のプロパティは、ACFがaboutおよびcontactアクションにのみ適用されることを指定します。 他のすべてのアクションは、アクセス制御の対象ではありません。 ルールプロパティには、アクセスルールが一覧表示されます。 すべてのゲスト(「?」ロールを持つ)は、 about アクションへのアクセスを許可されます。 すべての認証済みユーザー(「@」ロールを持つ)は、連絡先およびアクションに関するアクセスを許可されます。
URL http://localhost:8080/index.php?r = site/about にアクセスするとページが表示されますが、URL http://localhost:8080/index.phpを開くと?r = site/contact 、ログインページにリダイレクトされます。認証されたユーザーのみが contact アクションにアクセスできるためです。
アクセスルールは多くのオプションをサポートしています-
- allow -これが「許可」ルールか「拒否」ルールかを定義します。
- アクション-このルールが一致するアクションを定義します。
- controllers -このルールが一致するコントローラーを定義します。
- roles -このルールが一致するユーザーロールを定義します。 2つの特別な役割が認識されています-
- ?-ゲストユーザーに一致します。
- @ -認証されたユーザーと一致します。
- ips -このルールが一致するIPアドレスを定義します。
- verbs -このルールが一致する要求メソッド(POST、GET、PUTなど)を定義します。
- matchCallback -このルールを適用する必要があるかどうかを確認するために呼び出す必要があるPHP呼び出し可能関数を定義します。
- denyCallback -このルールがアクセスを拒否するときに呼び出されるPHP呼び出し可能関数を定義します。
パスワード
- ステップ1 *-Yiiは、パスワードを操作するための次の便利な方法を提供します。
public function actionAuth() {
$password = "asd%#G3";
//generates password hasg
$hash = Yii::$app->getSecurity()->generatePasswordHash($password);
var_dump($hash);
//validates password hash
if (Yii::$app->getSecurity()->validatePassword($password, $hash)) {
echo "correct password";
} else {
echo "incorrect password";
}
//generate a token
$key = Yii::$app->getSecurity()->generateRandomString();
var_dump($key);
//encrypt data with a secret key
$encryptedData = Yii::$app->getSecurity()->encryptByPassword("mydata", $key);
var_dump($encryptedData);
//decrypt data with a secret key
$data = Yii::$app->getSecurity()->decryptByPassword($encryptedData, $key);
var_dump($data);
//hash data with a secret key
$data = Yii::$app->getSecurity()->hashData("mygenuinedata", $key);
var_dump($data);
//validate data with a secret key
$data = Yii::$app->getSecurity()->validateData($data, $key);
var_dump($data);
}
ステップ2 *-URL *http://localhost:8080/index.php?r = site/auth を入力すると、次のように表示されます。
Yii-ローカリゼーション
- I18N(国際化)*は、さまざまな言語に適応できるアプリケーションを設計するプロセスです。 Yiiは、I18N機能の全範囲を提供します。
ロケールは、ユーザーの言語と国を指定するパラメーターのセットです。 たとえば、en-USは英語ロケールと米国を表します。 Yiiは、ソース言語とターゲット言語の2種類の言語を提供します。 ソース言語は、アプリケーション内のすべてのテキストメッセージが記述される言語です。 ターゲット言語は、エンドユーザーにコンテンツを表示するために使用する必要がある言語です。
メッセージ翻訳コンポーネントは、テキストメッセージをソース言語からターゲット言語に翻訳します。 メッセージを翻訳するには、メッセージ翻訳サービスがメッセージソースで検索する必要があります。
メッセージ翻訳サービスを使用するには、する必要があります-
- 翻訳するテキストメッセージをYii :: t()メソッドでラップします。
- メッセージソースを構成します。
- メッセージをメッセージソースに保存します。
- *ステップ1 *-Yii
- t()メソッドは次のように使用できます。
echo \Yii::t('app', 'This is a message to translate!');
上記のコードスニペットでは、「アプリ」はメッセージカテゴリを表します。
ステップ2 *-次に、 *config/web.php ファイルを変更します。
<?php
$params = require(__DIR__ . '/params.php');
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
//!!! insert a secret key in the following (if it is empty) - this
//is required by cookie validation
'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'i18n' => [
'translations' => [
'app*' => [
'class' => 'yii\i18n\PhpMessageSource',
'fileMap' => [
'app' => 'app.php'
],
],
],
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
//send all mails to a file by default. You have to set
//'useFileTransport' to false and configure a transport
//for the mailer to send real emails.
'useFileTransport' => true,
],
'log' => [
'flushInterval' => 1,
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'exportInterval' => 1,
'logVars' => [],
],
],
],
'db' => require(__DIR__ . '/db.php'),
],
//set target language to be Russian
'language' => 'ru-RU',
//set source language to be English
'sourceLanguage' => 'en-US',
'modules' => [
'hello' => [
'class' => 'app\modules\hello\Hello',
],
],
'params' => $params,
];
if (YII_ENV_DEV) {
//configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
return $config;
?>
上記のコードでは、ソース言語とターゲット言語を定義しています。 また、 yii \ i18n \ PhpMessageSource でサポートされているメッセージソースも指定します。 app *パターンは、appで始まるすべてのメッセージカテゴリをこの特定のメッセージソースを使用して翻訳する必要があることを示します。 上記の構成では、ロシア語の翻訳はすべてmessages/ru-RU/app.phpファイルに配置されます。
- ステップ3 *-次に、messages/ru-RUディレクトリ構造を作成します。 ru-RUフォルダー内にapp.phpというファイルを作成します。 これにより、すべてのEN→RU翻訳が保存されます。
<?php
return [
'This is a string to translate!' => 'Эта строка для перевода!'
];
?>
- ステップ4 *-SiteControllerでactionTranslation()という関数を作成します。
public function actionTranslation() {
echo \Yii::t('app', 'This is a string to translate!');
}
ステップ5 *-WebブラウザにURL *http://localhost:8080/index.php?r = site/translation を入力すると、次のように表示されます。
ターゲット言語をru-RUに設定すると、メッセージはロシア語に翻訳されました。 アプリケーションの言語を動的に変更できます。
ステップ6 *- actionTranslation()*メソッドを変更します。
public function actionTranslation() {
\Yii::$app->language = 'en-US';
echo \Yii::t('app', 'This is a string to translate!');
}
今、メッセージは英語で表示されます-
- ステップ7 *-翻訳されたメッセージには、1つまたは複数のパラメーターを挿入できます。
public function actionTranslation() {
$username = 'Vladimir';
//display a translated message with username being "Vladimir"
echo \Yii::t('app', 'Hello, {username}!', [
'username' => $username,
]), "<br>";
$username = 'John';
//display a translated message with username being "John"
echo \Yii::t('app', 'Hello, {username}!', [
'username' => $username,
]), "<br>";
$price = 150;
$count = 3;
$subtotal = 450;
echo \Yii::t('app', 'Price: {0}, Count: {1}, Subtotal: {2}', [$price, $count, $subtotal]);
}
出力は次のようになります。
個々のテキストメッセージを翻訳する代わりに、ビュースクリプト全体を翻訳できます。 たとえば、ターゲット言語がru-RUで、views/site/index.phpビューファイルを翻訳する場合は、ビューを翻訳してviews/site/ru-RUディレクトリに保存する必要があります。
- ステップ8 *-views/site/ru-RUディレクトリ構造を作成します。 次に、ru-RUフォルダー内に次のコードを含むindex.phpというファイルを作成します。
<?php
/*@var $this yii\web\View*/
$this->title = 'My Yii Application';
?>
<div class = "site-index">
<div class = "jumbotron">
<h1>Добро пожаловать!</h1>
</div>
</div>
ステップ9 *-ターゲット言語はru-RUであるため、URL *http://localhost:8080/index.php?r = site/index を入力すると、ロシア語の翻訳を含むページが表示されます。
Yii-Gii
Giiは、モデル、フォーム、モジュール、CRUDなどを生成するためのWebベースのコードジェネレーターを提供する拡張機能です。
デフォルトでは、次のジェネレータが利用可能です-
- Model Generator -指定されたデータベーステーブルのActiveRecordクラスを生成します。
- CRUD Generator -指定されたモデルのCRUD(作成、読み取り、更新、削除)操作を実装するコントローラーとビューを生成します。
- Controller Generator -1つまたは複数のコントローラーアクションと対応するビューを持つ新しいコントローラークラスを生成します。
- フォームジェネレータ-指定されたモデルクラスの入力を収集するフォームを表示するビュースクリプトファイルを生成します。
- モジュールジェネレータ-Yiiモジュールに必要なスケルトンコードを生成します。
- Extension Generator -Yii拡張機能に必要なファイルを生成します。
gii生成ツールを開くには、Webブラウザーのアドレスバーに* http://localhost:8080/index.php?r = gii:*と入力します。
DBの準備
- ステップ1 *-新しいデータベースを作成します。 データベースは、次の2つの方法で準備することができます-
- ターミナルで_mysql -u root –p_を実行します
- CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ciで新しいデータベースを作成します。
ステップ2 *- *config/db.php ファイルでデータベース接続を設定します。 次の構成は、現在使用されているシステム用です。
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
];
?>
ステップ3 *-ルートフォルダー内で./yii migrate/create test_table *を実行します。 このコマンドは、DBを管理するためのデータベース移行を作成します。 移行ファイルは、プロジェクトルートの *migrations フォルダーに表示されます。
ステップ4 *-この方法で移行ファイル(この場合は *m160106_163154_test_table.php )を変更します。
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160106_163154_test_table extends Migration {
public function safeUp() {
$this->createTable("user", [
"id" => Schema::TYPE_PK,
"name" => Schema::TYPE_STRING,
"email" => Schema::TYPE_STRING,
]);
$this->batchInsert("user", ["name", "email"], [
["User1", "[email protected]"],
["User2", "[email protected]"],
["User3", "[email protected]"],
["User4", "[email protected]"],
["User5", "[email protected]"],
["User6", "[email protected]"],
["User7", "[email protected]"],
["User8", "[email protected]"],
["User9", "[email protected]"],
["User10", "[email protected]"],
["User11", "[email protected]"],
]);
}
public function safeDown() {
$this->dropTable('user');
}
}
?>
上記の移行では、id、name、およびemailのフィールドを持つ user テーブルが作成されます。 また、いくつかのデモユーザーを追加します。
- ステップ5 *-プロジェクトのルート内で./yii migrate *を実行して、データベースに移行を適用します。
ステップ6 *-次に、 *user テーブルのモデルを作成する必要があります。 簡単にするために、 Gii コード生成ツールを使用します。 この url:http://localhost:8080/index.php?r = gii を開きます。 次に、「Model generator」ヘッダーの下にある「Start」ボタンをクリックします。 テーブル名(「ユーザー」)とモデルクラス(「MyUser」)を入力し、「プレビュー」ボタンをクリックして、最後に「生成」ボタンをクリックします。
MyUserモデルがモデルディレクトリに表示されます。
Gii-モデルの作成
Giiでモデルを作成するには-
<?php
namespace app\models;
use app\components\UppercaseBehavior;
use Yii;
/**
*This is the model class for table "user".
*
*@property integer $id
* @property string $name
*@property string $email
*/
class MyUser extends \yii\db\ActiveRecord {
/**
*@inheritdoc
*/
public static function tableName() {
return 'user';
}
/**
*@inheritdoc
*/
public function rules() {
return [
[[name', 'email'], 'string', 'max' => 255]
];
}
/**
*@inheritdoc
*/
public function attributeLabels() {
return [
'id' => 'ID',
'name' => 'Name',
'email' => 'Email',
];
}
}
?>
CRUDの生成
MyUserモデルのCRUDを生成します。
- ステップ1 *-CRUDジェネレーターインターフェイスを開き、フォームに入力します。
ステップ2 *-次に、[プレビュー]ボタンをクリックして[生成]をクリックします。 URL *http://localhost:8080/index.php?r = my-user にアクセスすると、すべてのユーザーのリストが表示されます。
ステップ3 *-URL *http://localhost:8080/index.php?r = my-user/create を開きます。 ユーザー作成フォームが表示されます。
Gii-コントローラーの生成
コントローラーの生成方法を見てみましょう。
- ステップ1 *-いくつかのアクションでコントローラーを生成するには、フォームに記入してコントローラージェネレーターインターフェイスを開きます。
ステップ2 *-次に、[プレビュー]ボタンをクリックして[生成]をクリックします。 index、hello、およびworldアクションを含む *CustomController.php ファイルがコントローラーフォルダーに生成されます。
<?php
namespace app\controllers;
class CustomController extends \yii\web\Controller {
public function actionHello() {
return $this->render('hello');
}
public function actionIndex() {
return $this->render('index');
}
public function actionWorld() {
return $this->render('world');
}
}
?>
フォーム生成
- ステップ1 *-既存のモデルからビューファイルを生成するには、フォーム生成インターフェイスを開いてフォームに入力します。
次に、「プレビュー」ボタンをクリックして「生成」をクリックします。 customviewビューファイルは、viewフォルダーに生成されます。
ステップ2 *-表示するには、 *CustomController に新しいメソッドを追加します。
public function actionView() {
$model = new MyUser();
return $this->render('/customview', [
'model' => $model,
]);
}
ステップ3 *-生成されたビューファイルを表示するには、URL *http://localhost:8080/index.php?r = custom/view を開きます。
Gii-生成モジュール
モジュールを生成する方法を見てみましょう。
- ステップ1 *-モジュールを生成するには、モジュール生成インターフェイスを開いてフォームに入力します。
- ステップ2 *-次に、[プレビュー]ボタンをクリックして[生成]をクリックします。
ステップ3 *-モジュールをアクティブにする必要があります。 *config/web.php ファイルの modules アプリケーションコンポーネントを変更します。
'modules' => [
'admin' => [
'class' => 'app\modules\admin\Module',
],
],
ステップ4 *-新しく生成されたモジュールが機能するかどうかを確認するには、WebブラウザでUR *http://localhost:8080/index.php?r = admin/default/index を入力します。