Perl日記

PerlとかRubyとかPHPとかPythonとか

Laravel5.1入門 その10 はじめてのFacade

Laravelにおけるファサードとは、デザインパターンファサードとは全く別物なので注意。
単にAPIを使うための機能と捉えておけばいいみたい。

目的

こんな感じでアプリ内からどこでも動くようにする。

<?php
use Bar;

Bar::is_piyo(); //=> true

本当に動くクラス

巡り巡って本当に動くis_piyo()メソッドを作る。

app/Piyo.php

<?php
namespace App;

class Piyo
{
    public function is_piyo()
    {
        return true;
    }
}

サービスプロバイダ

ファサードを使うためには、IoCコンテナで依存解決できるようにするのが不可欠なので、それを最も簡単に実現できるサービスプロバイダを設置する。

app/Providers/FugaServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Piyo;

class FugaServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->bind('piyo', function(){ return new Piyo; });
    }
}
サービスプロバイダを登録

前回と同じようにconfig/app.phpのprovidersに追加。

config/app.php

<?php
return [
    'providers' => [
        App\Providers\FugaServiceProvider::class,
    ]
]

ファサード

ファサードを継承してファサードを作る。
このときgetFacadeAccessor()をオーバライドして、サービスプロバイダで登録したキー名を返す。

app/Foo/Bar.php

<?php

namespace App\Foo;

use Illuminate\Support\Facades\Facade;

class Bar extends Facade
{
    protected static function getFacadeAccessor() { return 'piyo'; }
}
ファサードエイリアス

Illuminate\Support\Facades\App、ではなく、Appと呼び出すと短くていい感じなので、
ファサードエイリアスを登録するとさらに簡素に使用できる。

やりすぎると、名前空間とはなんだったのか、という気分になるけど。

config/app.php

<?php
return [
    'aliases' => [
        'Bar' => App\Foo\Bar::class,
    ]
]

できた

ここまで手間をかけてやっと動く。

<?php
//use Bar;
//先頭にバックスラッシュでもいける
\Bar::is_piyo(); //=> true

またまた、正直ここまでやってファサード使う意味あるの?、という気分だけど、「テストしやすい」とか「綺麗に書ける」とかいろいろ利点はあるようなので、もう少しレールに乗ってみたい。