
Laravel クラスのインスタンス化方法まとめ
クラスをインスタンス化する方法は何種類かある。
①app()->make
②app()->makeWith
③App::make
④resolve 関数
⑤app 関数
今回はインスタンス化する手順をまとめました。
①App::make関数でインスタンス化する手順
②bind を使ってインスタンス化する手順
③singleton を使ってインスタンス化する手順
④ファサードでインスタンスを取得する手順
を説明します。

①App::makeでインスタンス化する手順
- Controllersディレクトリに HelloWorldクラスを作成します。
<?php
class HelloWorld {
public function __construct() {
\Illuminate\Support\Facades\Log::debug('new HelloWorld');
}
public function say() {
echo 'hello world';
}
}
- 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 を使ってインスタンス化する手順
- Controllersディレクトリに HelloWorldクラスを作成します。
<?php
class HelloWorld {
public function __construct() {
\Illuminate\Support\Facades\Log::debug('new HelloWorld');
}
public function say() {
echo 'hello world';
}
}
- サービスコンテナに bind でクラスを登録します。
<?php
namespace App\Providers;
class AppServiceProvider extends \Illuminate\Support\ServiceProvider {
public function register() {
app()->bind('HelloWorld',\App\Http\Controllers\HelloWorld::class);
}
}
これで HelloWorld でインスタンス化できるようになります。
- 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 を使ってインスタンス化する手順
- Controllersディレクトリに HelloWorldクラスを作成します。
<?php
class HelloWorld {
public function __construct() {
\Illuminate\Support\Facades\Log::debug('new HelloWorld');
}
public function say() {
echo 'hello world';
}
}
- サービスコンテナに singleton でクラスを登録します。
<?php
namespace App\Providers;
class AppServiceProvider extends \Illuminate\Support\ServiceProvider {
public function register() {
app()->singleton('HelloWorld',\App\Http\Controllers\HelloWorld::class);
}
}
これで HelloWorld でインスタンス化できるようになります。
- 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
以上
④ファサードでインスタンスを取得する手順
- Controllersディレクトリに HelloWorldクラスを作成します。
<?php
class HelloWorld {
public function __construct() {
\Illuminate\Support\Facades\Log::debug('new HelloWorld');
}
public function say() {
echo 'hello world';
}
}
- サービスコンテナに 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 でインスタンス化するときに使う感じですね。
- ファサードクラスを作成します。
<?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 等で登録する必要はありません。
- app.php ファイルの aliases に HelloWorld を追加します。
'aliases' => [
:
'HelloWorld' => App\Http\Controllers\FacadeHelloWorld::class,
],
↑の「‘HelloWorld’」が↓の「\HelloWorld」に対応します。
- ファサードでsayメソッドを実行します。
\HelloWorld::say();
\HelloWorld::say();
storage/logs/laravel.log を確認するとインスタンスは1つです。
[2022-08-16 19:24:38] local.DEBUG: new HelloWorld
以上