基本的にはLaravel コードで見るファサードクラスの仕組み - Shin x blog
を見ればよいのだけれど、How Laravel Facades Work and How to Use Them Elsewhereという記事があったので、試しにSilexからFacadeを使ってみる。
ざっくりおさらい
- Facadeは、PimpleのようなIocコンテナに格納されたサービスを簡単に使うための方法。
-
App::make('some_service')->methodName()
やapp()->make('some_service')->methodName()
のかわりに、SomeService::methodName()
と書くことができる。 - Facadeという名前については色々議論がある。
- LaravelのFacadeを使うこと自体についても色々議論はある。個人的にはケースバイケースではないかと思う。
ではまずSilexとMonolog、そしてFacadeを使うためにilluminate/supportをインストールしよう。
$ composer require silex/silex monolog/monolog illuminate/support
適当にログを出力するアプリを作る。
web/index.php
<?php
require __DIR__.'/../vendor/autoload.php';
$app = new Silex\Application();
$app->register(new Silex\Provider\MonologServiceProvider(), [
'monolog.logfile' => 'php://stderr'
]);
$app['monolog']->addInfo("Hello");
このように、Monologを"monolog"
という文字列をキーに呼び出している。これの代わりとなるFacadeクラスを作ろう。
app\Facades\Log.php
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class Log extends Facade
{
protected static function getFacadeAccessor() {
return 'monolog';
}
}
composer.jsonにautoloaderの設定をしてcomposer dump-autoloadしておこう。
composer.json
{
"autoload": {
"psr-4": {
"App\\": "app/"
}
},
...
Facade::setFacadeApplication()にコンテナを渡す。これだけで取りあえずはFacadeを使えるようになる
web/index.php
<?php
require __DIR__.'/../vendor/autoload.php';
$app = new Silex\Application();
$app->register(new Silex\Provider\MonologServiceProvider(), [
'monolog.logfile' => 'php://stderr'
]);
Illuminate\Support\Facades\Facade::setFacadeApplication($app);
$app['monolog']->addInfo("Hello");
App\Facades\Log::addInfo("World");
これでも悪くないが、使う場合はnamespaceを書くかuseする必要がある。LaravelのAliasLoaderを使えばこれを省略することができる。なんだけれどもAliasLoaderを使うにはlaravel/frameworkが必要なようだ。さすがにちょっとやり過ぎ感があるのでここでやめておこう。