laravelのfacadeを作る方法
Facade(ファサード)とは
Facade = あるclassのエイリアスのことで、クラスで定義しているメソッドをカンタンに、見た目も簡潔に使うことができる。
例)
// Routeの部分をFacadeとよぶ。
Route::get();
Facadeを作って使えるように登録する方法
デフォルトで存在するAppのFacadeを使う場合を例にしてFacadeがどうやって使えるようになっているのかについて、大まかな流れです。
厳密にはAppの場合は違うかもしれないですが、一般にFacadeを作るのはこういう流れになるといったとらえ方でイメージして記事を書きましたのでご了承ください。
クラス(Applicationクラス)を作成
llminate\Foundation\Application
にコードが書かれており、1000行以上の膨大なコードが書かれています。
プロパティ、メソッドなど大量に書かれています。
<補足>
llminate\Foundation\Application
上記のようなフルパスをFQCNとよぶ。
FQCN = Fully Qualified Class Name の略
laravelの洋書でよく出てきた単語だったので、覚えておくと良さげかと思います。
</補足>
Facadeクラスを継承したクラスを作る
Facadeを作るためには、Facade クラスを継承したクラスを作る必要があります。表面的だけど、Facadeを作るためにFacade専用のクラスを作っておく必要がある。くらいに覚えておくといいかと思います。
<?php
namespace Illuminate\Support\Facades;
/**
...ズラーっと書いてあるのを省略しています。
*
*/
class App extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'app';
}
}
getFacadeAccessor()メソッドで 'app' という文字列をリターンしています。
Facadeクラスを継承したAppクラスに登録したappという文字列によって、結果的に、service containerからApplicationクラスのインスタンスがよびだされる感じです。
※インスタンスが呼び出される過程でまだいろんな処理が下記のように間にあるのですが、難しいので、省略しました。
App::hoge();のようにfacadeを使ってメソッドを呼び出すと、Facadeクラスを継承したAppクラスが呼び出されるのですが、コードを見ての通り、メソッドはgetFacadeAccessor()しかなく、このクラスにないメソッドをよぶことになるので、マジックメソッドが呼ばれて、さらに違うクラスとメソッドが実行されて結果としてApplicationクラスのメソッドが呼ばれるようになっています。
config\app.phpにFacadeクラスを継承したクラスであるAppクラスをキーと一緒に書くことでエイリアスを登録
// app.phpの一部を抜粋
'aliases' => [
'App' => Illuminate\Support\Facades\App::class,
]
configフォルダのapp.phpの中にエイリアス(aliases)としてFacadeを継承したクラスを登録することで、Facadeが使えるようになる。
あとは、必要な場面で、
App::hoge()みたいな感じで使う。
メソッドは、Appファサードの元であるApplicationクラスに定義しているメソッドが使えます。
とても便利だけど、でかい規模の開発とかでは、デメリットもあるようです。
laravelの公式ドキュメントでFacadeのキーとクラスと、どのインスタンスがバインドされるのか一覧で見れますので、勉強のために僕も見ていこうと思います。
詳しくはこちら↓