Laravel クラスのインスタンス化方法まとめ

ショコラ
ショコラ

Laravel クラスのインスタンス化方法まとめ

クラスをインスタンス化する方法は何種類かある。
①app()->make
②app()->makeWith
③App::make
④resolve 関数
⑤app 関数

今回はインスタンス化する手順をまとめました。
①App::make関数でインスタンス化する手順
②bind を使ってインスタンス化する手順
③singleton を使ってインスタンス化する手順
④ファサードでインスタンスを取得する手順
を説明します。

もっさん先輩
もっさん先輩

①App::makeでインスタンス化する手順

  1. Controllersディレクトリに HelloWorldクラスを作成します。
<?php
class HelloWorld {
  public function __construct() {
    \Illuminate\Support\Facades\Log::debug('new HelloWorld');
  }
  public function say() {
    echo 'hello world';
  }
}
  1. App::make でインスタンス化して sayメソッドを実行します。
use Illuminate\Support\Facades\App;
App::make(\App\Http\Controllers\HelloWorld::class)->say();
App::make(\App\Http\Controllers\HelloWorld::class)->say();

storage/logs/laravel.log を確認するとインスタンスは2つあります。

[2022-08-16 21:58:47] local.DEBUG: new HelloWorld
[2022-08-16 21:58:47] local.DEBUG: new HelloWorld

以上

②bind を使ってインスタンス化する手順

  1. Controllersディレクトリに HelloWorldクラスを作成します。
<?php
class HelloWorld {
  public function __construct() {
    \Illuminate\Support\Facades\Log::debug('new HelloWorld');
  }
  public function say() {
    echo 'hello world';
  }
}
  1. サービスコンテナに bind でクラスを登録します。
<?php
namespace App\Providers;
class AppServiceProvider extends \Illuminate\Support\ServiceProvider {
  public function register() {
    app()->bind('HelloWorld',\App\Http\Controllers\HelloWorld::class);
  }
}

これで HelloWorld でインスタンス化できるようになります。

  1. App::make でインスタンス化して sayメソッドを実行します。
use Illuminate\Support\Facades\App;
App::make('HelloWorld')->say();
App::make('HelloWorld')->say();

storage/logs/laravel.log を確認するとインスタンスは2つあります。

[2022-08-16 21:58:24] local.DEBUG: new HelloWorld
[2022-08-16 21:58:24] local.DEBUG: new HelloWorld

以上

③singleton を使ってインスタンス化する手順

  1. Controllersディレクトリに HelloWorldクラスを作成します。
<?php
class HelloWorld {
  public function __construct() {
    \Illuminate\Support\Facades\Log::debug('new HelloWorld');
  }
  public function say() {
    echo 'hello world';
  }
}
  1. サービスコンテナに singleton でクラスを登録します。
<?php
namespace App\Providers;
class AppServiceProvider extends \Illuminate\Support\ServiceProvider {
  public function register() {
    app()->singleton('HelloWorld',\App\Http\Controllers\HelloWorld::class);
  }
}

これで HelloWorld でインスタンス化できるようになります。

  1. App::make でインスタンス化して sayメソッドを実行します。
use Illuminate\Support\Facades\App;
App::make('HelloWorld')->say();
App::make('HelloWorld')->say();

storage/logs/laravel.log を確認するとインスタンスは1つです。

[2022-08-16 22:00:20] local.DEBUG: new HelloWorld

以上

④ファサードでインスタンスを取得する手順

  1. Controllersディレクトリに HelloWorldクラスを作成します。
<?php
class HelloWorld {
  public function __construct() {
    \Illuminate\Support\Facades\Log::debug('new HelloWorld');
  }
  public function say() {
    echo 'hello world';
  }
}
  1. サービスコンテナに bind でクラスを登録します。
<?php
namespace App\Providers;
class AppServiceProvider extends \Illuminate\Support\ServiceProvider {
  public function register() {
    app()->bind('HelloWorld',\App\Http\Controllers\HelloWorld::class);
   #app()->singleton('HelloWorld',\App\Http\Controllers\HelloWorld::class);
  }
}

ファサードはシングルトンのように使えます。たとえ↑のサービスコンテナに singleton ではなく bind で登録してもです。ここでの singleton、bind は App::make でインスタンス化するときに使う感じですね。

  1. ファサードクラスを作成します。
<?php
namespace App\Http\Controllers;
class FacadeHelloWorld extends \Illuminate\Support\Facades\Facade {
  protected static function getFacadeAccessor() { return 'HelloWorld'; }
}

↑の「return ‘HelloWorld‘」が「App::make(‘HelloWorld‘)」の「HelloWorld」の部分のようです。なので「return \App\Http\Controllers\HelloWorld::class;」としても通ります。その場合、サービスコンテナに bind 等で登録する必要はありません。

  1. app.php ファイルの aliases に HelloWorld を追加します。
    'aliases' => [
      :
      'HelloWorld' => App\Http\Controllers\FacadeHelloWorld::class,
    ],

↑の「‘HelloWorld’」が↓の「\HelloWorld」に対応します。

  1. ファサードでsayメソッドを実行します。
\HelloWorld::say();
\HelloWorld::say();

storage/logs/laravel.log を確認するとインスタンスは1つです。

[2022-08-16 19:24:38] local.DEBUG: new HelloWorld

以上

Scroll to Top