イベント

CodeIgniterのイベント機能は、コアファイルをハッキングすることなく、フレームワークの内部動作にアクセスして変更する手段を提供します。CodeIgniterの実行は、特定の実行プロセスに従います。しかし、実行プロセスの特定の段階で何らかのアクションを実行させたい場合があります。たとえば、コントローラーが読み込まれる直前または直後、または他の場所で独自のスクリプトの1つをトリガーしたい場合があります。

イベントは、*公開/購読*パターンで動作します。イベントは、スクリプト実行のどこかでトリガーされます。他のスクリプトは、Eventsクラスに登録することでそのイベントを「購読」し、イベントがトリガーされたときにアクションを実行することを通知できます。

イベントの有効化

イベントは常に有効になっており、グローバルに使用できます。

イベントの定義

ほとんどのイベントは、**app/Config/Events.php**ファイル内で定義されています。Eventsクラスのon()メソッドを使用して、イベントにアクションを登録できます。最初の引数は登録するイベントの名前です。2番目の引数は、イベントがトリガーされたときに実行される呼び出し可能なオブジェクトです。

<?php

use CodeIgniter\Events\Events;

Events::on('pre_system', ['MyClass', 'myFunction']);

この例では、pre_systemイベントが実行されるたびに、MyClassのインスタンスが作成され、myFunction()メソッドが実行されます。2番目の引数は、PHPが認識する呼び出し可能なオブジェクトの任意の形式にすることができます。

<?php

use CodeIgniter\Events\Events;

// Call a standalone function
Events::on('pre_system', 'some_function');

// Call on an instance method
$user = new \App\Libraries\User();
Events::on('pre_system', [$user, 'someMethod']);

// Call on a static method
Events::on('pre_system', 'SomeClass::someMethod');

// Use a Closure
Events::on('pre_system', static function (...$params) {
    // ...
});

優先度の設定

複数のメソッドを単一のイベントに登録できるため、それらのメソッドを呼び出す順序を定義する必要があります。on()メソッドの3番目の引数として優先度値を渡すことでこれを行うことができます。値が低いほど先に実行され、1の値が最も高い優先度を持ち、値の下限はありません。

<?php

use CodeIgniter\Events\Events;

Events::on('post_controller_constructor', 'some_function', 25);

同じ優先度を持つすべての登録者は、定義された順序で実行されます。

v4.2.0以降、値に役立つ範囲を設定する3つのクラス定数が定義されています。これらを使用する必要はありませんが、可読性が向上する可能性があります。

<?php

use CodeIgniter\Events\Events;

Events::PRIORITY_LOW;    // 200
Events::PRIORITY_NORMAL; // 100
Events::PRIORITY_HIGH;   // 10

重要

定数EVENT_PRIORITY_LOWEVENT_PRIORITY_NORMALEVENT_PRIORITY_HIGHは非推奨となり、定義はapp/Config/Constants.phpに移動されました。これらは将来のリリースで削除されます。

ソート後、すべての購読者が順に実行されます。購読者がブール値falseを返す場合、購読者の実行は停止します。

独自のイベントの公開

Eventsライブラリを使用すると、独自のコードで簡単にイベントを作成できます。この機能を使用するには、イベント名を使用して**Events**クラスのtrigger()メソッドを呼び出すだけです。

<?php

\CodeIgniter\Events\Events::trigger('some_event');

追加の引数として追加することで、購読者に任意の数の引数を渡すことができます。購読者には、定義されたのと同じ順序で引数が渡されます。

<?php

use CodeIgniter\Events\Events;

Events::trigger('some_events', $foo, $bar, $baz);

Events::on('some_event', static function ($foo, $bar, $baz) {
    // ...
});

イベントのシミュレーション

テスト中は、1日に何百ものメールを送信することは遅く非生産的であるため、イベントを実際に発生させたくない場合があります。simulate()メソッドを使用して、Eventsクラスにイベントの実行をシミュレートするように指示できます。**true**の場合、すべてのイベントはトリガーメソッド中にスキップされます。ただし、他のすべては通常どおり動作します。

<?php

use CodeIgniter\Events\Events;

Events::simulate(true);

falseを渡すことでシミュレーションを停止できます。

<?php

use CodeIgniter\Events\Events;

Events::simulate(false);

イベントポイント

以下は、CodeIgniterコアコードで使用可能なイベントポイントのリストです。

  • **pre_system** システム実行の初期段階で呼び出されます。URI、リクエスト、レスポンスはインスタンス化されていますが、ページキャッシュの確認、ルーティング、「before」コントローラーフィルターの実行はまだ行われていません。

  • **post_controller_constructor** コントローラーのインスタンス化直後、メソッド呼び出しが行われる前に呼び出されます。

  • **post_system** システム実行の最後、つまり「after」コントローラーフィルターの実行後に、最終的にレンダリングされたページがブラウザに送信される直前に呼び出されます。

  • **email** CodeIgniter\Email\Emailからメールが正常に送信された後に呼び出されます。Emailクラスのプロパティの配列を引数として受け取ります。

  • **DBQuery** 成功または失敗にかかわらず、データベースクエリの実行後に呼び出されます。Queryオブジェクトを受け取ります。

  • **migrate** latest()またはregress()へのマイグレーション呼び出しが成功した後に呼び出されます。MigrationRunnerの現在のプロパティとメソッド名を受け取ります。