カテゴリ: Symfony 更新日: 2026/02/27

Symfonyの依存性注入(DI)とは?コンストラクタでの注入方法を初心者向けに徹底解説

Symfonyの依存性注入(DI)とは?コンストラクタでの注入方法
Symfonyの依存性注入(DI)とは?コンストラクタでの注入方法

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

生徒

「Symfonyってサービスとか依存性注入とか、難しそうな言葉が多くて混乱します…」

先生

「Symfonyは最初に言葉でつまずきやすいですが、考え方はとてもシンプルですよ」

生徒

「コンストラクタで注入するって、何を注入するんですか?」

先生

「では、Symfonyの依存性注入を日常の例に置き換えながら説明していきましょう」

1. Symfonyにおける依存性注入(DI)とは?

1. Symfonyにおける依存性注入(DI)とは?
1. Symfonyにおける依存性注入(DI)とは?

Symfonyの依存性注入(Dependency Injection、DI)とは、クラスが必要とする部品(オブジェクト)を、自分で作らずに外から受け取る仕組みのことです。プログラミング未経験の方は、「部品を借りる仕組み」と考えるとイメージしやすくなります。

例えば、料理をするときに毎回フライパンを自作する人はいません。必要なときにキッチンからフライパンを借ります。Symfonyでは、この「キッチン」にあたる役割をサービスコンテナが担っています。

2. そもそも「サービス」とは何か?

2. そもそも「サービス」とは何か?
2. そもそも「サービス」とは何か?

Symfonyでいうサービスとは、アプリケーションの中で使い回される便利な機能のかたまりです。メール送信、データベース接続、ログ出力などが代表的な例です。

Symfonyでは、ほとんどの機能がサービスとして管理されています。つまり、「Symfonyを使う=サービスを組み合わせてアプリを作る」と考えて問題ありません。

3. なぜ依存性注入が必要なのか?

3. なぜ依存性注入が必要なのか?
3. なぜ依存性注入が必要なのか?

もし依存性注入を使わず、クラスの中で直接オブジェクトを作ると、修正や変更にとても弱いコードになります。例えば、メール送信方法を変えたい場合、あちこちのコードを書き換える必要が出てきます。

依存性注入を使うことで、部品を差し替えるだけで動作を変更でき、コードが読みやすく、壊れにくくなります。これがSymfonyがDIを重視している理由です。

4. コンストラクタとは?注入の入り口

4. コンストラクタとは?注入の入り口
4. コンストラクタとは?注入の入り口

コンストラクタとは、クラスが作られる瞬間に自動で実行される特別なメソッドです。Symfonyでは、このコンストラクタを使ってサービスを受け取ります。

難しく考えず、「クラスが生まれるときに、必要な道具をまとめて渡す場所」と覚えてください。

5. コンストラクタで依存性注入する基本例

5. コンストラクタで依存性注入する基本例
5. コンストラクタで依存性注入する基本例

class HelloService
{
    public function sayHello()
    {
        return 'こんにちは';
    }
}

class SampleController
{
    private $helloService;

    public function __construct(HelloService $helloService)
    {
        $this->helloService = $helloService;
    }

    public function index()
    {
        return $this->helloService->sayHello();
    }
}

この例では、SampleControllerHelloServiceに依存しています。Symfonyが自動的にHelloServiceを用意して、コンストラクタに渡してくれます。

6. Symfonyが自動で注入できる理由

6. Symfonyが自動で注入できる理由
6. Symfonyが自動で注入できる理由

Symfonyにはオートワイヤリングという仕組みがあります。これは、型(クラス名)を見て、必要なサービスを自動で判断してくれる機能です。

そのため、初心者でも設定ファイルを細かく書かずに、コンストラクタに型を書くことで依存性注入ができます。

7. サービスを複数注入する場合

7. サービスを複数注入する場合
7. サービスを複数注入する場合

class LoggerService
{
    public function log($message)
    {
        return 'ログ:' . $message;
    }
}

class MultiServiceController
{
    private $helloService;
    private $loggerService;

    public function __construct(
        HelloService $helloService,
        LoggerService $loggerService
    ) {
        $this->helloService = $helloService;
        $this->loggerService = $loggerService;
    }

    public function index()
    {
        $message = $this->helloService->sayHello();
        return $this->loggerService->log($message);
    }
}

このように、必要なサービスを並べて受け取るだけでOKです。Symfonyが裏側で全て準備してくれます。

8. 依存性注入を使うと何が嬉しいのか?

8. 依存性注入を使うと何が嬉しいのか?
8. 依存性注入を使うと何が嬉しいのか?

依存性注入を使うことで、コードの役割がはっきりし、読みやすくなります。また、修正やテストがしやすくなり、長く使えるプログラムになります。

Symfonyの設計思想そのものがDIを前提としているため、この考え方を理解することがSymfony学習の大きな土台になります。

9. 初心者がつまずきやすいポイント

9. 初心者がつまずきやすいポイント
9. 初心者がつまずきやすいポイント

最初は「いつnewしているのか分からない」と不安になりますが、Symfonyでは基本的に自分でnewしません。サービスはコンテナが管理し、必要なときに渡されます。

「自分で作らないで、渡してもらう」という意識を持つと、依存性注入が一気に分かりやすくなります。

カテゴリの一覧へ
新着記事
New1
CodeIgniter
CodeIgniterでRESTful API開発!初心者でもわかる全体構成ガイド
New2
Symfony
Symfonyのコントローラとは?作成・構造・役割を初心者向けにやさしく解説!
New3
Symfony
Symfonyでバリデーションメッセージを多言語対応する方法!初心者でもわかる国際化の基本
New4
Symfony
Symfonyのキャッシュ機構の基本を理解しよう(HTTPとアプリ別)
人気記事
No.1
Java&Spring記事人気No1
Laravel
Laravelのシングルアクションコントローラとは?使い方と利点
No.2
Java&Spring記事人気No2
Laravel
Laravelで動的パラメータをルートに渡す方法!初心者にもやさしいルートパラメータの使い方入門
No.3
Java&Spring記事人気No3
Laravel
LaravelのBlade構文まとめ!@if @foreach など基本ディレクティブ解説
No.4
Java&Spring記事人気No4
Laravel
Laravelでキャッシュを使う方法(ファイル・Redis・Memcached)
No.5
Java&Spring記事人気No5
Laravel
Laravelで名前付きルートを設定する方法!初心者でもわかるroute()関数の使い方
No.6
Java&Spring記事人気No6
Symfony
Symfonyの依存性注入(DI)とは?コンストラクタでの注入方法を初心者向けに徹底解説
No.7
Java&Spring記事人気No7
Laravel
Laravelのマイグレーション履歴を確認する方法を徹底解説!migrate:statusの使い方
No.8
Java&Spring記事人気No8
Laravel
Laravelでコントローラを作成する方法(artisanコマンド)