laravelを使っていれば自然と使うことになるFacade.
FacadeとはもともとデザインパターンのFacadeパターンが有名ですけど、「シンプルな使い方を提供する」って感じの意味で名付けてるんでしょうね。
APIみたいなイメージでしょうか。
そんなFacadeですがもちろん作れます。作ってみましょう。
テストなので文字列を出力する単純な機能だけです。
TestEchoHelper クラスという名前にします。Heplerっていう名前は特別必要ないです。TestEchoDesuyo クラスとかでも大丈夫です。
手順が少し複雑なので、先に説明しましょう。
- 実装したい機能を持つクラスを作る(TestEchoHelper クラス)
- TestEchoHelperクラスのインスタンス化方法を決める
- サービスプロバイダの機能を使って、手順2で指定した「インスタンス化の方法」をサービスコンテナの機能に登録する
- 3で指定したサービスプロバイダを実際に起動するときに実行するように登録する。起動時とはlaravelの起動時(リクエストがあった時など)である (config/app.php)
- 実際に使う窓口となるTestEchoFacadeクラスを作る
- TestEchoFacadeクラスを呼び出すときの別名を決める (config/app.php)
- 実際に呼び出して使う
長いですね。。。一つ一つやっていきましょう。
1 クラスの作成
クラスを作ります。場所はどこでもいいです。
どこでもいいって言われると逆に困るかもしれませんが、どこでも大丈夫です。好きな場所にしましょう。
今回はapp/Helpersっていうディレクトリを作って、そこに作ります。
これで完了!
2 インスタンス化方法を決める
今回は普通にnew しましょう。つまり、new TestEchoHelper() です。まずは単純に。
3 インスタンス化方法を登録
少し複雑になってきます。Illuminate\Support\ServiceProviderクラスを継承したクラスを準備します。
今回用意するAppServiceProviderクラスはデフォルトで用意されてるサービスプロバイダーです。App\Providers\AppServiceProvider にありますね。
デフォルトでregisterメソッドとbootメソッド、2つのメソッドが用意されています。
registerメソッド→bootメソッドの順で自動で動きます。すごいですねー。
その前に、そもそも「サービスコンテナとは何か」?というと、
「クラスのインスタンス化方法を定めるもの」
と思って大丈夫です。laravelではバインドする、って言います。
今回の例で言えば、「TestEchoHepler クラスは new されてインスタンス化されますよー」って知らせてるわけですね。
で、サービスプロバイダっていうのはそのサービスコンテナに対してインスタンス化方法を登録する場所、みたいなイメージです。
ちなみにサービスコンテナの実体は \Illuminate\Contracts\Foundation\Application クラスのことです。
ServiceProviderクラスを継承すると、サービスプロバイダの中でサービスコンテナ(Applicationクラスのインスタンス)をプロパティ名 app として使えます。
下の画像でいうと$this->app ですね。
このサービスコンテナのbindメソッドで、TestEchoHelperメソッドのインスタンス化方法を登録します。
1つ前の手順で決めたように、そのまま new TestEchoHelper() としています。
第1引数のTestEchoってなんだ?と思ったかもしれません。
これはサービスコンテナから「俺はTestEchoを使う!」って呼び出したときに、TestEchoHelperクラスのインスタンス化方法が実行されるようにしています。
つまり、インスタンス化方法の名前を決めてるわけですね。
今回は「’TestEcho’っていうインスタンス化方法で、TestEchoHelperクラスはインスタンス化される」という登録をしました。
「そんな長く文字書くのイヤだ」って方は$this->app->bind(‘Te’, function()…)って書いても大丈夫です。
これで「TestEchoHeplerクラスを呼び出す方法をサービスコンテナに登録する」準備が整いました。
まだ準備なんですね。。。
4 「インスタンス化方法をサービスコンテナに登録するサービスプロバイダ」をlaravel起動時に呼び出すようにする。
呼び出そうとしているのはサービスプロバイダです。「サービスコンテナにインスタンス化方法を登録する処理を書くクラス」です。
落ち着いて順番に追っていきましょう。
登録する場所は config/app.php ファイルです。laravelを入れたなら一回は見たことある場所じゃないでしょうか?
ここのproviders配列内にクラス名を登録します。今回のAppServiceProviderはもう登録されていますね。
ここに登録することで、laravel起動時にAppServiceProviderクラスのregisterメソッドとbootメソッド(あれば)が実行されます。
laravel起動時ってリクエスト時だけじゃないの?って思うかもしれませんが、シェルなどの実行時も動きます。
5 ファサードクラスを作る
やっとFacadeが出てきました。このFacadeクラスもどこにおいても大丈夫です。今回はapp/Facadesディレクトリを作ってそこに置きます。
このFacadeクラスでは何を書くかといえば、getFacadeAccesorメソッドで「サービスコンテナに登録されたインスタンス化方法の名前を返す」
ことだけです。もっと書いてもいいんでしょうけど。
今回は手順3(覚えてますか?)で、サービスコンテナによるTestEchoHelperクラスのインスタンス化方法を「TestEcho」っていう名前にしたので、
TestEchoを返します。これだけ!
6 別名を決める
やっとここまで来ました。これもconfig/app.phpです。
見覚えがあるんじゃないでしょうか?
実際に呼び出すことになるのはTestEchoFacadeクラスです。なんといっても窓口ですから。
でもTestEchoFacade::って少し長いですね?なのでTestEcho::で呼び出せるようにします。
手順3で「インスタンス化の方法」にもTestEchoと名付けてここでも同じ名前ですが、同じ名前にする必要性はありません。
ただ、同じにした方がわかりやすい気もします。
7 実際に使う
やっと使えます!
まずはコントローラーから。コントローラは名前空間App\Http\Controllers 配下にあるので、絶対パスで指定しましょう。
やりました。↑は画像ですが白文字背景+黒文字だけなのでわかりにくくてすみません。
viewでも出してみましょう。
そうですね。
こんな感じでカスタムヘルパーみたいなのを作れます。
参考になれば。