Laravelで共通メソッドをファサードで実装してみます。
Laravelで共通処理をどのように実装するのが最適なのか悩んでいました。
少し調べてみてたら、シンプルに任意のフォルダにクラスを配置して、それを読み込んでいる方もいらっしゃるようです。
それでも特に問題ないのですが、せっかくLaravelを使ってるので、Laravelの機能を使って、それっぽく実装してみたい。。
そこで、今回はファサードを利用して、共通メソッドを用意してみました。
共通クラスを作成
まず、共通化したい処理をまとめてた任意のクラス「…/app/MyClasses/Util.php」を用意します。
処理はシンプルに「Hello Facade!」を出力するメソッドのみです。
<?php namespace App\MyClasses; class Util { public function hello() { return 'Hello Facade!'; } }
ファサードを作成
次に、共通クラスを利用するためのファサードを作成します。
フォルダ「…/app/Facades/」を新規で作成して、そこに新規ファイル「Util.php」を作成し、以下を記述します。
<?php namespace App\Facades; use Illuminate\Support\Facades\Facade; class Util extends Facade { protected static function getFacadeAccessor() { return 'util'; } }
作成したファサードはエイリアス登録します。
ファイル「…/config/app.php」を開き、「aliases」の部分に以下を追記します。
'aliases' => [ (既存のエイリアスの記述) ... 'Util' => App\Facades\Util::class, ],
サービスプロバイダの用意
次に、作成したファサードに共通クラスを登録するためのサービスプロバイダを用意します。
デフォルトのサービスプロバイダ「…/app/Providers/AppServiceProvider.php」を使用することも可能ですが、今回はそれ用に新規作成します。
以下のコマンドでサービスプロバイダ「…/app/Providers/UtilServiceProvider.php」を作成します。
> php artisan make:provider UtilServiceProvider
作成したサービスプロバイダを開き、メソッドregister()でシングルトン結合します。
第1引数には先ほどファサードのメソッドgetFacadeAccessor()で返す値、第2引数に共通クラスを指定します。
class UtilServiceProvider extends ServiceProvider { public function register() { app()->singleton('util', 'App\MyClasses\Util'); }
サービスプロバイダは「…/config/app.php」に登録しないと機能しないので、ファイルを開き、「providers」の部分に以下を追記します。
'providers' => [ (既存のクラスの記述) ... App\Providers\UtilServiceProvider::class, ],
ファサードを利用する
先ほど、ファサードをエイリアス登録したので、以下のようにしてコントローラ内などで実行できます。
Util::hello();
コードに問題がなければ「Hello Facade!」と出力されるはずです。
理解するまで、ちょっと大変かもしれませんが、慣れればいろいろ活用できそうです。
コメントする