Laravel使ってみた (14) - FacadeとServiceProviderの使い方? -
使い方合ってるのかは定かじゃない。当てずっぽうで書いてる感も否めないのですが。ドキュメント的には http://laravel.com/docs/facades と http://laravel.com/docs/ioc の組み合わせ的な感じかと
例えば、とあるクラスを作る。それをApp::bindを行なってIoC Containerに登録するなりで
$hoge = App::make("hoge");
$hoge->say();
的な事をやればbindで返した値が取得出来る。ただ、Laravelを使ってみての主観上として、
Hoge::say();
的な感じでメソッド自体はインスタンスメソッドだけど、スタティックメソッドのように扱える設計方式っていうのがコア的な所も多いんじゃないのかっと。でそういう風に扱えるようにするには
- Illuminate\Support\Facades\Facadeを継承したクラスを作り、getFacadesAccessorを実装する。実装内容はServiceProviderでApp::bindした名前?
- Illuminate\Support\ServiceProviderを継承したクラスを作り、registerメソッドを実装する。そこでApp::bind等を行う
- 作成したServiceProviderをApp::registerする
的な感じじゃないかなーと。
Hoge.php
<?php
use Illuminate\Support\Facades\Facade;
class Hoge extends Facade {
protected static function getFacadeAccessor() {
return "hoge";
}
}
HogeServiceProvider.php
<?php
use Illuminate\Support\ServiceProvider;
class HogeServiceProvider extends ServiceProvider {
public function register() {
$this->app->bind("hoge", function() {
return new HogeService();
});
}
}
HogeService.php
<?php
class HogeService {
public function say() {
return "hoge";
}
}
で上記のHogeServiceProviderをApp::registerしておく。あとは
var_dump(Hoge::say());
的な事をやるとIoC Containerからの名前解決により実装クラスインスタンスが取得されて利用できるような感じ
冒頭でも言ったけどこういう使い方が正しいのかは微妙だけど、こういう設計を利用する事でコントローラーとかでApp::makeなどをせずにIoC Containerな機能を利用してインスタンスを取得したりするっていう方式の方が望ましいのはっては思う所