カテゴリ: CodeIgniter 更新日: 2026/05/20

CodeIgniter 4 サービスの作り方!依存関係管理とデザインパターンの基本

CodeIgniterで依存関係をサービスとして管理する設計例
CodeIgniterで依存関係をサービスとして管理する設計例

先生と生徒の会話形式で理解しよう

生徒

「CodeIgniterでWebサイトを作っているのですが、『依存関係』とか『サービス』という言葉が出てきて難しそうです。パソコンも初心者なのですが、私でもわかりますか?」

先生

「大丈夫ですよ!『サービス』とは、料理でいう『便利なお料理道具セット』のようなものです。一度準備しておけば、どこでも使い回せる仕組みのことなんです。」

生徒

「どこでも使い回せる道具……それは便利そうですね!どうやって使うんですか?」

先生

「それでは、CodeIgniterでの依存関係管理の魔法、サービスについて一緒に学んでいきましょう!」

1. サービス(Services)と依存関係とは何か?

1. サービス(Services)と依存関係とは何か?
1. サービス(Services)と依存関係とは何か?

プログラミングの世界、特にPHPのフレームワークであるCodeIgniter 4(コードイグナイター)では、「サービス」という概念が非常に重要です。パソコンを初めて触る方にとって「依存関係」という言葉は少し怖い響きがあるかもしれませんが、実はとても身近な例えで説明できます。

例えば、あなたが「美味しいカレーを作る」というプログラム(命令)を書きたいとします。カレーを作るには「包丁」と「鍋」が必要です。このとき、カレー作りは包丁と鍋に「依存」していると言います。包丁がないと野菜が切れませんし、鍋がないと煮込めないからです。

しかし、毎回カレーを作るたびに「新しい包丁を買いに行く」のは大変ですよね? そこで、キッチンの特定の場所(サービス)に行けば、いつでも「切れる包丁」を貸してもらえる仕組みがあれば便利です。これがCodeIgniterにおけるサービス管理の本質です。必要な道具(クラス)を、フレームワークが一元管理して、いつでも取り出せるようにしてくれるのです。

2. なぜサービスを使う必要があるのか?

2. なぜサービスを使う必要があるのか?
2. なぜサービスを使う必要があるのか?

なぜ「サービス」を使って依存関係を管理するのでしょうか。それは、「コードをきれいに保ち、修正しやすくするため」です。これをプログラミング用語で「保守性を高める」と言います。もしサービスを使わずに、プログラムのあちこちで「新しい包丁を買う」という命令(newというキーワードを使います)を書いてしまうと、後で「やっぱりもっと高級な包丁に変えたい」と思ったときに、全ての場所を書き直さなければなりません。

サービスとして登録しておけば、一箇所を書き換えるだけで、家中の包丁が自動的に高級なものに置き換わります。初心者の方でも、将来大きなシステムを作るときに困らないよう、この「一箇所で管理する」という考え方を身につけておくことが大切です。CodeIgniterは、この管理を「Services.php」というファイルで行う決まりになっています。

3. サービスとして管理するクラスを作ってみよう

3. サービスとして管理するクラスを作ってみよう
3. サービスとして管理するクラスを作ってみよう

まずは、使い回したい「道具」となるクラスを作ってみましょう。今回は、簡単な「メッセージを表示する道具」を例にします。これを「通知サービス」と呼ぶことにします。PHPでは、機能をまとめた箱のことをクラスと呼びます。


namespace App\Libraries;

// 通知を送るための「道具(クラス)」を定義します
class NotificationService {
    public function send(string $message) {
        return "【通知】: " . $message;
    }
}

このコードは、App\Librariesというフォルダの中に保存します。namespace(名前空間)とは、ファイルがたくさん増えたときに見つけやすくするための「住所」のようなものです。public function sendというのは、この道具が持っている「メッセージを送る機能」の名前です。

4. Services.phpに登録する

4. Services.phpに登録する
4. Services.phpに登録する

道具を作ったら、それをCodeIgniterに「これはサービスとして登録してね!」と教えてあげる必要があります。app/Config/Services.phpというファイルに設定を追記します。ここが「道具の管理センター」になります。


namespace Config;

use CodeIgniter\Config\BaseService;
use App\Libraries\NotificationService;

class Services extends BaseService {
    // 通知サービスを登録するメソッド
    public static function notification($getShared = true) {
        if ($getShared) {
            return static::getSharedInstance('notification');
        }
        return new NotificationService();
    }
}

ここで出てくるgetShared(ゲット・シェアード)という言葉は、「共有しますか?」という意味です。もしこれが「はい(true)」なら、同じ道具を使い回し、もし「いいえ(false)」なら、呼ぶたびに新品の道具を用意してくれます。基本的には使い回す(true)のが一般的です。

5. コントローラーからサービスを呼び出す

5. コントローラーからサービスを呼び出す
5. コントローラーからサービスを呼び出す

いよいよ、登録したサービスを実際に使ってみましょう。Webブラウザに画面を表示する役割を持つコントローラーという場所で呼び出します。サービスを使うときは、Config\Services::サービス名()という書き方をします。これは「管理センターのサービスを呼んでね」という合図です。


namespace App\Controllers;

use Config\Services;

class Home extends BaseController {
    public function index() {
        // 管理センターから「通知サービス」を取り出します
        $notice = Services::notification();

        // サービスを使ってメッセージを作成
        $data['my_message'] = $notice->send("CodeIgniterのサービス管理はバッチリです!");

        // 画面に表示する(ビューに渡す)
        return view('welcome_message', $data);
    }
}

このように、コントローラーの中で「new NotificationService()」と直接書かなくて済むのがポイントです。コントローラーは「何をしたいか」だけを考えればよく、「どうやって道具を準備するか」は管理センター(Services.php)にお任せできるのです。

6. 依存関係の注入(DI)とは何か?

6. 依存関係の注入(DI)とは何か?
6. 依存関係の注入(DI)とは何か?

ここで少しだけステップアップした用語、「依存関係の注入(Dependency Injection / DI)」について解説します。文字だけで見ると難しいですが、要は「外から道具を渡してあげること」です。自分の中で道具を自前で用意するのではなく、他の誰か(今回はCodeIgniter)から「はい、これを使ってね」と渡される様子を、「注入」と呼びます。

これを徹底すると、プログラムの部品(クラス)同士がくっつきすぎず、レゴブロックのように自由に入れ替えができるようになります。テスト(プログラムが正しく動くか確認する作業)をするときも、「本物のメールを送るサービス」の代わりに「画面に表示するだけの偽のメールサービス」を注入することで、安全にテストができるようになるという素晴らしいメリットがあります。

7. 別のサービスを組み合わせてみよう

7. 別のサービスを組み合わせてみよう
7. 別のサービスを組み合わせてみよう

サービスは複数を組み合わせて使うこともできます。例えば、「ログ(記録)を残すサービス」と「通知サービス」を一緒に使ってみましょう。CodeIgniterには最初から入っているサービスもたくさんあります。例えば「Logger(ロガー)」という、エラーや動作の記録を保存する機能です。これらを組み合わせて、より高度なプログラムを作ってみます。


namespace App\Controllers;

use Config\Services;

class LogController extends BaseController {
    public function check() {
        // ロガーサービスを呼び出す
        $logger = Services::logger();
        
        // 自作の通知サービスを呼び出す
        $notice = Services::notification();

        // ログを記録する
        $logger->info("通知処理が実行されました。");

        // 通知を表示する
        echo $notice->send("ログの記録も完了しましたよ!");
    }
}

このように、必要な道具を次々と管理センターから呼び出して使うことができます。コードがスッキリして、何をやっているかが非常に分かりやすくなりますね。これがCodeIgniter 4が提供する洗練された開発スタイルの第一歩です。

8. 初心者がサービス管理で気をつけること

8. 初心者がサービス管理で気をつけること
8. 初心者がサービス管理で気をつけること

最後に、サービスを使い始める初心者の方が陥りやすいポイントを整理します。まず、なんでもかんでもサービスに登録する必要はありません。「複数の場所で使い回すもの」や「設定が複雑なもの」を優先して登録しましょう。単純なデータを入れるだけの箱(エンティティなど)は、そのままnewで使っても問題ありません。

また、Services.phpを編集するときは、PHPの文法(セミコロン ; を忘れない、カッコの数を合わせるなど)に特に注意してください。管理センターが壊れてしまうと、サイト全体が動かなくなってしまうからです。ですが、怖がる必要はありません。エラーが出たら、エラーメッセージを読んで、どこが間違っているかを確認すればいいのです。そうやって少しずつ、パソコンの操作やプログラミングに慣れていきましょう。

CodeIgniterのサービス機能を使いこなせるようになると、あなたのプログラミングスキルは一段上のレベルに上がります。最初は難しく感じるかもしれませんが、繰り返し「道具を作って、登録して、呼び出す」という流れを練習してみてください。自然と指が動くようになれば、あなたも立派なPHPエンジニアの仲間入りです!

カテゴリの一覧へ
新着記事
New1
Laravel
Laravelのルーティングでサブドメインを使う方法!初心者向けにやさしく解説
New2
Laravel
Laravelでマルチ言語ルートを設定する方法!ロケールごとのprefixで簡単管理
New4
Laravel
Laravelのインストール方法まとめ!ComposerとLaravel Installerの使い方
人気記事
No.1
Java&Spring記事人気No1
Laravel
Laravelのインストール方法まとめ!ComposerとLaravel Installerの使い方
No.2
Java&Spring記事人気No2
Symfony
SymfonyのRemember Me機能を完全解説!初心者でもわかるログイン保持の仕組み
No.3
Java&Spring記事人気No3
Laravel
Laravelでルートに中間処理を追加する方法!ミドルウェア活用ガイド
No.4
Java&Spring記事人気No4
Laravel
Laravelでログを出力する方法(Monolog・storage/logs)
No.5
Java&Spring記事人気No5
Laravel
Laravelでドメインルートを使う方法!マルチドメイン対応を初心者向けに解説
No.6
Java&Spring記事人気No6
Laravel
LaravelのFeatureテストとUnitテストの違いを理解しよう
No.7
Java&Spring記事人気No7
CodeIgniter
CodeIgniterで多言語対応(Language)を徹底解説!言語切り替え機能を実装
No.8
Java&Spring記事人気No8
CodeIgniter
CodeIgniterでファイルアップロードとストレージ管理をマスター!初心者向け完全ガイド