4 フォロワー

アプリケーション

アプリケーションは、Yii アプリケーションシステムの全体的な構造とライフサイクルを管理するオブジェクトです。各 Yii アプリケーションシステムには、エントリスクリプトで作成され、`\Yii::$app`という式でグローバルにアクセスできる、単一のアプリケーションオブジェクトが含まれています。

情報: コンテキストによっては、「アプリケーション」はアプリケーションオブジェクトまたはアプリケーションシステムのいずれかを意味する場合があります。

アプリケーションには、Web アプリケーションコンソールアプリケーションの2種類があります。名前が示すように、前者は主にWebリクエストを処理し、後者はコンソールコマンドリクエストを処理します。

アプリケーション設定

エントリスクリプトがアプリケーションを作成すると、設定を読み込み、次のようにアプリケーションに適用します。

require __DIR__ . '/../vendor/autoload.php';
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';

// load application configuration
$config = require __DIR__ . '/../config/web.php';

// instantiate and configure the application
(new yii\web\Application($config))->run();

通常の設定と同様に、アプリケーション設定はアプリケーションオブジェクトのプロパティを初期化する方法を指定します。アプリケーション設定は非常に複雑になることが多いため、通常は設定ファイル(上記の例では`web.php`ファイルなど)に保存されます。

アプリケーションプロパティ

アプリケーション設定で設定する必要がある重要なアプリケーションプロパティが多数あります。これらのプロパティは、通常、アプリケーションが実行されている環境を記述します。たとえば、アプリケーションはコントローラーの読み込み方法、一時ファイルの保存場所などを認識する必要があります。以下では、これらのプロパティを要約します。

必須プロパティ

どのアプリケーションでも、少なくとも2つのプロパティ、idbasePathを設定する必要があります。

id

idプロパティは、アプリケーションを他のアプリケーションと区別する一意のIDを指定します。これは主にプログラムで利用されます。必須ではありませんが、最適な相互運用性のために、アプリケーションIDを指定する際には英数字のみを使用することをお勧めします。

basePath

basePathプロパティは、アプリケーションのルートディレクトリを指定します。これは、アプリケーションシステムのすべての保護されたソースコードを含むディレクトリです。このディレクトリの下には、通常、MVCパターンに対応するソースコードを含む`models`、`views`、`controllers`などのサブディレクトリがあります。

ディレクトリパスまたはパスエイリアスを使用してbasePathプロパティを設定できます。どちらの形式でも、対応するディレクトリが存在する必要があります。存在しない場合、例外がスローされます。パスは`realpath()`関数を呼び出すことで正規化されます。

basePath プロパティは、他の重要なパス(例:ランタイムパス)を導出するために頻繁に使用されます。このため、このパスを表すエイリアス @app があらかじめ定義されています。導出されたパスは、このエイリアスを使用して形成できます(例:ランタイムディレクトリを参照するには @app/runtime)。

重要なプロパティ

この小節で説明するプロパティは、アプリケーションによって異なるため、多くの場合、構成する必要があります。

aliases

このプロパティを使用すると、配列でエイリアスのセットを定義できます。配列のキーはエイリアスの名前であり、配列の値は対応するパスの定義です。例えば

[
    'aliases' => [
        '@name1' => 'path/to/path1',
        '@name2' => 'path/to/path2',
    ],
]

このプロパティは、Yii::setAlias() メソッドを呼び出すのではなく、アプリケーションの設定でエイリアスを定義できるように提供されています。

bootstrap

これは非常に便利なプロパティです。アプリケーションのブートストラッププロセス中に実行する必要があるコンポーネントの配列を指定できます。たとえば、モジュールを使用してURLルールをカスタマイズする場合は、このプロパティの要素としてそのIDをリストできます。

このプロパティにリストされている各コンポーネントは、次のいずれかの形式で指定できます。

  • componentsで指定されたアプリケーションコンポーネントID、
  • modulesで指定されたモジュールID、
  • クラス名、
  • 構成配列、
  • コンポーネントを作成して返す無名関数。

例えば

[
    'bootstrap' => [
        // an application component ID or module ID
        'demo',

        // a class name
        'app\components\Profiler',

        // a configuration array
        [
            'class' => 'app\components\Profiler',
            'level' => 3,
        ],

        // an anonymous function
        function () {
            return new app\components\Profiler();
        }
    ],
]

情報:モジュールIDがアプリケーションコンポーネントIDと同じ場合、ブートストラッププロセス中にアプリケーションコンポーネントが使用されます。代わりにモジュールを使用する場合は、次のようない無名関数を使用して指定できます。

[
    function () {
        return Yii::$app->getModule('user');
    },
]

ブートストラッププロセス中に、各コンポーネントがインスタンス化されます。コンポーネントクラスがyii\base\BootstrapInterfaceを実装している場合、そのbootstrap()メソッドも呼び出されます。

Basic Project Templateのアプリケーション設定におけるもう1つの実用的な例として、アプリケーションが開発環境で実行されている場合、debugモジュールとgiiモジュールがブートストラップコンポーネントとして構成されています。

if (YII_ENV_DEV) {
    // configuration adjustments for 'dev' environment
    $config['bootstrap'][] = 'debug';
    $config['modules']['debug'] = 'yii\debug\Module';

    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = 'yii\gii\Module';
}

注意:bootstrapにコンポーネントを多く入れると、各リクエストに対して同じコンポーネントセットを実行する必要があるため、アプリケーションのパフォーマンスが低下します。したがって、ブートストラップコンポーネントは慎重に使用してください。

catchAll

このプロパティはWebアプリケーションのみでサポートされています。すべてのユーザーリクエストを処理する必要があるコントローラーアクションを指定します。これは主に、アプリケーションがメンテナンスモードであり、単一のアクションを介してすべての着信リクエストを処理する必要がある場合に使用されます。

構成は、最初の要素がアクションのルートを指定する配列です。配列の残りの要素(キーと値のペア)は、アクションにバインドするパラメーターを指定します。例えば

[
    'catchAll' => [
        'offline/notice',
        'param1' => 'value1',
        'param2' => 'value2',
    ],
]

情報:このプロパティが有効になっている場合、開発環境でのデバッグパネルは機能しません。

components

これは最も重要なプロパティです。他の場所で使用できる、アプリケーションコンポーネントと呼ばれる名前付きコンポーネントのリストを登録できます。例えば

[
    'components' => [
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
        ],
    ],
]

各アプリケーションコンポーネントは、配列内のキーと値のペアとして指定されます。キーはコンポーネントIDを表し、値はコンポーネントクラス名または構成を表します。

アプリケーションに任意のコンポーネントを登録でき、後で\Yii::$app->componentIDという式を使用してグローバルにアクセスできます。

詳細については、アプリケーションコンポーネントセクションを参照してください。

controllerMap

このプロパティを使用すると、コントローラーIDを任意のコントローラークラスにマップできます。デフォルトでは、Yiiは規則に基づいてコントローラーIDをコントローラークラスにマップします(例:ID postapp\controllers\PostControllerにマップされます)。このプロパティを構成することにより、特定のコントローラーの規則を破ることができます。次の例では、accountapp\controllers\UserControllerに、articleapp\controllers\PostControllerにマップされます。

[
    'controllerMap' => [
        'account' => 'app\controllers\UserController',
        'article' => [
            'class' => 'app\controllers\PostController',
            'enableCsrfValidation' => false,
        ],
    ],
]

このプロパティの配列キーはコントローラーIDを表し、配列の値は対応するコントローラークラス名または構成を表します。

controllerNamespace

このプロパティは、コントローラークラスが存在するデフォルトの名前空間を指定します。デフォルトはapp\controllersです。コントローラーIDがpostの場合、規則により、対応するコントローラークラス名(名前空間なし)はPostControllerになり、完全修飾クラス名はapp\controllers\PostControllerになります。

コントローラークラスは、この名前空間に対応するディレクトリのサブディレクトリにも配置できます。たとえば、コントローラーIDがadmin/postの場合、対応する完全修飾コントローラークラスはapp\controllers\admin\PostControllerになります。

完全修飾コントローラークラスは自動ロード可能であること、およびコントローラークラスの実際の名前空間がこのプロパティの値と一致することが重要です。そうでない場合、アプリケーションにアクセスすると「ページが見つかりません」エラーが発生します。

上記のように規則を破る場合は、controllerMapプロパティを構成できます。

language

このプロパティは、アプリケーションがエンドユーザーにコンテンツを表示する際に使用する言語を指定します。このプロパティのデフォルト値はen(英語)です。アプリケーションで複数の言語をサポートする必要がある場合は、このプロパティを構成する必要があります。

このプロパティの値は、メッセージの翻訳、日付の書式設定、数値の書式設定など、さまざまな国際化の側面を決定します。たとえば、yii\jui\DatePickerウィジェットは、このプロパティ値をデフォルトで使用して、カレンダーをどの言語で表示するか、日付をどのようにフォーマットするかを決定します。

IETF言語タグで言語を指定することをお勧めします。たとえば、enは英語を表し、en-USは英語(米国)を表します。

このプロパティの詳細については、国際化セクションを参照してください。

modules

このプロパティは、アプリケーションに含まれるモジュールを指定します。

このプロパティは、モジュールIDを配列キーとする、モジュールクラスまたは構成の配列を受け取ります。例えば

[
    'modules' => [
        // a "booking" module specified with the module class
        'booking' => 'app\modules\booking\BookingModule',

        // a "comment" module specified with a configuration array
        'comment' => [
            'class' => 'app\modules\comment\CommentModule',
            'db' => 'db',
        ],
    ],
]

詳細については、モジュールセクションを参照してください。

name

このプロパティは、エンドユーザーに表示されるアプリケーション名を指定します。一意の値をとる必要があるidプロパティとは異なり、このプロパティの値は主に表示目的のためのものであり、一意である必要はありません。

コードでこのプロパティを使用していない場合は、このプロパティを構成する必要はありません。

params

このプロパティは、グローバルにアクセス可能なアプリケーションパラメーターの配列を指定します。コード全体でハードコードされた数値や文字列を使用する代わりに、それらを1か所でアプリケーションパラメーターとして定義し、必要な場所でパラメーターを使用することをお勧めします。たとえば、サムネイル画像のサイズを次のようにパラメーターとして定義できます。

[
    'params' => [
        'thumbnail.size' => [128, 128],
    ],
]

次に、サイズ値を使用する必要があるコードでは、次のコードを使用するだけで済みます。

$size = \Yii::$app->params['thumbnail.size'];
$width = \Yii::$app->params['thumbnail.size'][0];

後でサムネイルのサイズを変更することにした場合、アプリケーションの設定で変更するだけで済みます。依存関係のあるコードに触れる必要はありません。

sourceLanguage

このプロパティは、アプリケーションコードが記述されている言語を指定します。デフォルト値は'en-US'(英語(米国))です。コード内のテキストコンテンツが英語でない場合は、このプロパティを構成する必要があります。

languageプロパティと同様に、IETF言語タグでこのプロパティを構成する必要があります。たとえば、enは英語を表し、en-USは英語(米国)を表します。

このプロパティの詳細については、国際化セクションを参照してください。

timeZone

このプロパティは、PHPランタイムのデフォルトのタイムゾーンを設定する代替方法として提供されています。このプロパティを構成することで、本質的にPHP関数date_default_timezone_set()を呼び出しています。例えば

[
    'timeZone' => 'America/Los_Angeles',
]

タイムゾーンの設定の影響の詳細については、日付の書式設定に関するセクションを確認してください。

version

このプロパティは、アプリケーションのバージョンを指定します。デフォルトは'1.0'です。コードでこのプロパティを使用していない場合は、このプロパティを構成する必要はありません。

便利なプロパティ

この小節で説明するプロパティは、デフォルト値が一般的な規則から導き出されるため、一般的には構成されません。ただし、規則を破る場合は、それらを構成することもできます。

charset

このプロパティは、アプリケーションが使用する文字セットを指定します。デフォルト値は'UTF-8'であり、多くの非Unicodeデータを使用するレガシーシステムで作業している場合を除き、ほとんどのアプリケーションではそのままにしておく必要があります。

defaultRoute

このプロパティは、リクエストでルートが指定されていない場合にアプリケーションが使用するルートを指定します。ルートには、子モジュールID、コントローラーID、および/またはアクションIDを含めることができます。たとえば、helppost/create、またはadmin/post/createです。アクションIDが指定されていない場合、このプロパティはyii\base\Controller::$defaultActionで指定されたデフォルト値を使用します。

Webアプリケーションの場合、このプロパティのデフォルト値は'site'であり、これはSiteControllerコントローラーとそのデフォルトアクションを使用することを意味します。その結果、ルートを指定せずにアプリケーションにアクセスすると、app\controllers\SiteController::actionIndex()の結果が表示されます。

コンソールアプリケーションの場合、デフォルト値は'help'であり、これはコアコマンドyii\console\controllers\HelpController::actionIndex()を使用することを意味します。その結果、引数を指定せずにコマンドyiiを実行すると、ヘルプ情報が表示されます。

extensions

このプロパティは、アプリケーションによってインストールおよび使用されている拡張機能のリストを指定します。デフォルトでは、ファイル@vendor/yiisoft/extensions.phpによって返される配列を使用します。extensions.phpファイルは、Composerを使用して拡張機能をインストールするときに自動的に生成および維持されます。したがって、ほとんどの場合、このプロパティを構成する必要はありません。

拡張機能を手動で管理する特別な場合は、次のようにこのプロパティを構成できます。

[
    'extensions' => [
        [
            'name' => 'extension name',
            'version' => 'version number',
            'bootstrap' => 'BootstrapClassName',  // optional, may also be a configuration array
            'alias' => [  // optional
                '@alias1' => 'to/path1',
                '@alias2' => 'to/path2',
            ],
        ],

        // ... more extensions like the above ...

    ],
]

ご覧のように、このプロパティは拡張機能の仕様の配列を受け取ります。各拡張機能は、name要素とversion要素からなる配列で指定されます。拡張機能がブートストラップ処理中に実行する必要がある場合、ブートストラップクラス名または設定配列を指定してbootstrap要素を指定できます。拡張機能はいくつかのエイリアスを定義することもできます。

layout

このプロパティは、ビューのレンダリング時に使用するデフォルトのレイアウトの名前を指定します。デフォルト値は'main'で、レイアウトパスの下にあるmain.phpレイアウトファイルが使用されます。レイアウトパスビューパスの両方がデフォルト値を使用している場合、デフォルトのレイアウトファイルはパスエイリアス@app/views/layouts/main.phpで表すことができます。

デフォルトでレイアウトを無効にする場合は、このプロパティをfalseに設定できますが、これは非常にまれです。

layoutPath

このプロパティは、レイアウトファイルを検索するパスを指定します。デフォルト値は、ビューパスの下にあるlayoutsサブディレクトリです。ビューパスがデフォルト値を使用している場合、デフォルトのレイアウトパスはパスエイリアス@app/views/layoutsで表すことができます。

ディレクトリまたはパスエイリアスとして設定できます。

runtimePath

このプロパティは、ログファイルやキャッシュファイルなどのテンポラリファイルを生成できるパスを指定します。デフォルト値は、エイリアス@app/runtimeで表されるディレクトリです。

ディレクトリまたはパスエイリアスとして設定できます。ランタイムパスは、アプリケーションを実行しているプロセスによって書き込み可能である必要があります。また、その下に含まれるテンポラリファイルには機密情報が含まれる可能性があるため、エンドユーザーがアクセスできないように保護する必要があります。

このパスへのアクセスを簡素化するために、Yiiは@runtimeという名前のパスエイリアスを事前に定義しています。

viewPath

このプロパティは、ビューファイルが配置されているルートディレクトリを指定します。デフォルト値は、エイリアス@app/viewsで表されるディレクトリです。ディレクトリまたはパスエイリアスとして設定できます。

vendorPath

このプロパティは、Composerによって管理されるベンダーディレクトリを指定します。Yiiフレームワークを含む、アプリケーションで使用されるすべてのサードパーティライブラリが含まれています。デフォルト値は、エイリアス@app/vendorで表されるディレクトリです。

このプロパティは、ディレクトリまたはパスエイリアスとして設定できます。このプロパティを変更する場合は、Composerの設定もそれに合わせて調整してください。

このパスへのアクセスを簡素化するために、Yiiは@vendorという名前のパスエイリアスを事前に定義しています。

enableCoreCommands

このプロパティは、コンソールアプリケーションのみでサポートされています。Yiiリリースに含まれるコアコマンドを有効にするかどうかを指定します。デフォルト値はtrueです。

アプリケーションイベント

アプリケーションは、リクエストの処理中にいくつかのイベントを発生させます。アプリケーション設定で、これらのイベントにイベントハンドラーを次のようにアタッチできます。

[
    'on beforeRequest' => function ($event) {
        // ...
    },
]

on eventName構文の使用については、設定セクションで説明されています。

あるいは、アプリケーションインスタンスが作成された後のブートストラップ処理中にイベントハンドラーをアタッチすることもできます。例えば

\Yii::$app->on(\yii\base\Application::EVENT_BEFORE_REQUEST, function ($event) {
    // ...
});

EVENT_BEFORE_REQUEST

このイベントは、アプリケーションがリクエストを処理するに発生します。実際のイベント名はbeforeRequestです。

このイベントが発生すると、アプリケーションインスタンスは設定および初期化されています。そのため、イベントメカニズムを使用してカスタムコードを挿入し、リクエスト処理プロセスをインターセプトするのに適した場所です。たとえば、イベントハンドラーでは、いくつかのパラメーターに基づいてyii\base\Application::$languageプロパティを動的に設定できます。

EVENT_AFTER_REQUEST

このイベントは、アプリケーションがリクエストの処理を完了した、レスポンスを送信するに発生します。実際のイベント名はafterRequestです。

このイベントが発生すると、リクエスト処理が完了し、リクエストのポスト処理を実行したり、レスポンスをカスタマイズしたりする機会があります。

レスポンスコンポーネントも、エンドユーザーにレスポンスコンテンツを送信している間にいくつかのイベントを発生させます。これらのイベントは、このイベントのに発生します。

EVENT_BEFORE_ACTION

このイベントは、すべてのコントローラーアクションを実行するに発生します。実際のイベント名はbeforeActionです。

イベントパラメーターはyii\base\ActionEventのインスタンスです。イベントハンドラーはyii\base\ActionEvent::$isValidプロパティをfalseに設定して、アクションの実行を停止できます。例えば

[
    'on beforeAction' => function ($event) {
        if (some condition) {
            $event->isValid = false;
        } else {
        }
    },
]

同じbeforeActionイベントは、モジュールコントローラーによっても発生します。アプリケーションオブジェクトは最初にこのイベントを発生させ、次にモジュール(存在する場合)、最後にコントローラーが続きます。イベントハンドラーがyii\base\ActionEvent::$isValidfalseに設定した場合、後続のイベントはすべて発生しなくなります。

EVENT_AFTER_ACTION

このイベントは、すべてのコントローラーアクションを実行したに発生します。実際のイベント名はafterActionです。

イベントパラメーターはyii\base\ActionEventのインスタンスです。yii\base\ActionEvent::$resultプロパティを通じて、イベントハンドラーはアクションの結果にアクセスしたり変更したりできます。例えば

[
    'on afterAction' => function ($event) {
        if (some condition) {
            // modify $event->result
        } else {
        }
    },
]

同じafterActionイベントは、モジュールコントローラーによっても発生します。これらのオブジェクトは、beforeActionとは逆の順序でこのイベントを発生させます。つまり、コントローラーが最初にこのイベントを発生させ、次にモジュール(存在する場合)、最後にアプリケーションが続きます。

アプリケーションライフサイクル

Application Lifecycle

エントリスクリプトがリクエストを処理するために実行されると、アプリケーションは次のライフサイクルを経ます。

  1. エントリスクリプトは、アプリケーション設定を配列として読み込みます。
  2. エントリスクリプトは、アプリケーションの新しいインスタンスを作成します。
    • preInit()が呼び出され、basePathなど、いくつかの優先度の高いアプリケーションプロパティが設定されます。
    • エラーハンドラーを登録します。
    • アプリケーションプロパティを設定します。
    • init()が呼び出され、さらにbootstrap()を呼び出してブートストラップコンポーネントを実行します。
  3. エントリスクリプトはyii\base\Application::run()を呼び出してアプリケーションを実行します。
    • EVENT_BEFORE_REQUESTイベントが発生します。
    • リクエストを処理します。リクエストをルートと関連するパラメーターに解決し、ルートで指定されたモジュール、コントローラー、アクションオブジェクトを作成し、アクションを実行します。
    • EVENT_AFTER_REQUESTイベントが発生します。
    • エンドユーザーにレスポンスを送信します。
  4. エントリスクリプトはアプリケーションから終了ステータスを受け取り、リクエスト処理を完了します。

タイプミスを見つけた場合、またはこのページの改善が必要と思われる場合は、
githubで編集してください。 !