CodeIgniter 4 グローバルフィルタ設定ガイド!初心者でもわかるWebアプリの共通処理
生徒
「CodeIgniterで、全てのページが表示される前に共通のチェック(ログイン確認など)をしたいのですが、一つずつ書くのは大変ですよね?」
先生
「その通りです!そんな時に便利なのが『グローバルフィルタ』という機能です。これを使えば、全てのページに自動的にルールを適用できますよ。」
生徒
「それは便利そうですね!どうやって設定するのか教えてください!」
先生
「まずはフィルタの基本的な仕組みから、ゆっくり順番に解説していきますね!」
1. フィルタ機能とは?Webサイトの「門番」を理解しよう
プログラミングの世界で「フィルタ(Filters)」とは、特定の処理が実行される前や後に、別の処理を割り込ませる仕組みのことを指します。CodeIgniter(コードイグナイター)というPHPのフレームワーク(アプリを作るための道具箱)では、この機能が非常に強力です。
例えば、あなたが遊園地に行くと想像してください。アトラクション(Webページ)に乗る前には、必ず「チケットを持っているか」の確認がありますよね。各アトラクションの入り口で一人ずつ確認するのではなく、遊園地全体の入り口で一括して確認できれば効率的です。この「入り口でのチェック」が、まさにグローバルフィルタの役割なのです。
専門的な言葉では、ページが表示される前の処理を「Beforeフィルタ」、表示された後の処理を「Afterフィルタ」と呼びます。これを使うことで、ログインしていない人を追い返したり、全てのページに共通のセキュリティ設定を施したりすることが可能になります。
2. フィルタ本体の作成!まずは「ルール」を決めよう
フィルタを使うには、まず「どんなチェックをするか」というルールを書いたプログラムファイルを作る必要があります。CodeIgniterでは、app/Filters というフォルダの中にこのファイルを作成します。
今回は、例として「デバッグ用にメッセージを表示するだけの簡単なフィルタ」を考えてみましょう。難しいことは抜きにして、まずはプログラムが動く感覚を掴むことが大切です。以下のコードは、フィルタの基本的な形です。
namespace App\Filters;
use CodeIgniter\Filters\FilterInterface;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
class MyTestFilter implements FilterInterface
{
// ページが表示される前に実行される魔法
public function before(RequestInterface $request, $arguments = null)
{
// ここに「ページを表示する前にやりたいこと」を書きます
echo "フィルタが動いています!ページを表示する前のチェック完了。";
}
// ページが表示された後に実行される魔法
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
{
// ここに「ページを表示した後にやりたいこと」を書きます
}
}
このコードにある implements FilterInterface という部分は、「私はフィルタとしての機能をしっかり持っていますよ」という宣言のようなものです。パソコンを触ったことがない方でも、「この形がテンプレートなんだな」と思っておけば大丈夫です。
3. フィルタに「あだ名」を付けよう!Config設定の基本
ルールを作っただけでは、CodeIgniterはそれを使ってくれません。次に、作ったフィルタに名前(エイリアス)を付けて登録する必要があります。これを行うのが app/Config/Filters.php という設定ファイルです。
このファイルを開くと、$aliases という項目があります。ここに、「自分で作ったフィルタの場所」と「好きな名前」をセットで書き込みます。これにより、プログラムの中で短い名前でフィルタを呼び出せるようになります。料理で言えば、「佐藤さんの家で作った特別な隠し味」を「魔法の粉」という名前で登録するようなイメージですね。
実際に登録するコードを見てみましょう。
public array $aliases = [
'csrf' => \CodeIgniter\Filters\CSRF::class,
'toolbar' => \CodeIgniter\Filters\DebugToolbar::class,
'honeypot' => \CodeIgniter\Filters\Honeypot::class,
// ここに自分のフィルタを追加!
'my_checker' => \App\Filters\MyTestFilter::class,
];
これで、MyTestFilter という長い名前の代わりに、my_checker という短い名前でこのルールを扱えるようになりました。これが設定の第一歩です。
4. グローバルフィルタを適用!全てのページにルールを反映
いよいよ本題の「グローバルフィルタ」の設定です。先ほど登録した my_checker を、サイト全体に適用してみましょう。同じ app/Config/Filters.php ファイルの中にある $globals という項目を探してください。
この $globals は、名前の通り「全体(グローバル)」に関する設定を管理しています。ここにフィルタ名を追加するだけで、サイト内の全ページでそのフィルタが自動的に動き出します。プログラミング未経験の方でも、このリストに名前を書き加えるだけなら簡単ですよね!
public array $globals = [
'before' => [
// ページが表示される前に動かしたいフィルタをここに書く
'my_checker',
// 'honeypot',
// 'csrf',
],
'after' => [
'toolbar',
// 'honeypot',
],
];
実行結果を確認すると、どのページにアクセスしても画面の上の方に「フィルタが動いています!」という文字が表示されるはずです。たったこれだけで、100ページあっても1000ページあっても、一瞬で全てのページに共通の処理を追加できたことになります。
フィルタが動いています!ページを表示する前のチェック完了。
(ここから下の通常のWebサイトの内容が表示される)
5. 特定のページだけ除外したい時は?除外設定のテクニック
グローバルフィルタは非常に便利ですが、「お問い合わせページだけはチェックを外したい」とか「ログイン画面自体にログインチェックをかけると、無限ループになってしまう」といった困った場面も出てきます。そんな時に使うのが except(除外)という設定です。
設定ファイルで、フィルタ名を指定する際に「このページだけは無視してね」という指示を出すことができます。例えば、ログインページ(login)と新規登録ページ(register)をフィルタの対象から外す設定は、以下のようになります。
public array $globals = [
'before' => [
'my_checker' => ['except' => ['login', 'register', 'api/*']],
],
'after' => [
'toolbar',
],
];
ここで使われている *(アスタリスク)という記号は、ワイルドカードと呼ばれます。「api/」から始まるページ全部、という意味になります。このように、例外をうまく設定することで、より柔軟なWebアプリの制御が可能になります。初心者の方は、まず「基本は全部、でも特定は外せる」という仕組みだけ覚えておけば完璧です。
6. なぜグローバルフィルタを使うのか?そのメリットを再確認
最後に、なぜこの面倒そうな設定を行うのか、その理由を整理しておきましょう。プログラミングにおいて、同じコードを何度も書くことは「悪」とされています。これを「DRYの原則(Don't Repeat Yourself:自分を繰り返すな)」と呼びます。
もしグローバルフィルタを使わずに、全てのページにログインチェックのコードをコピペしていたらどうなるでしょうか。もしチェック方法を少し変えたくなった時、何百ものファイルを修正しなければなりません。それは間違いのもとですし、何よりとても疲れますよね。
グローバルフィルタを使えば、一箇所(フィルタファイル)を直すだけで、アプリ全体の挙動を一度に変更できます。これを保守性(メンテナンスのしやすさ)が高いと言います。初心者からプロのエンジニアになるための第一歩は、このような「楽をするための賢い仕組み」を使いこなせるようになることなのです。
CodeIgniterのフィルタ機能は、他にも「特定のグループだけに適用する」など、さらに高度な使い方がたくさんあります。まずは今回のグローバル設定をマスターして、Webアプリ開発の楽しさを実感してくださいね!