Edited at

Facadeをつくる

More than 3 years have passed since last update.

Eloquentじゃない人も、Modelじゃなくてもなんでもですが

独自にFacadeを作成することもできます。

ディレクトリもどこでも良いんですが、app下にextensionsを作ったとします。

(composer.jsonに追加してください)

facadeを通じて使いたいものをこんな感じで作るとします。

laravel4の機能を使いたければ適当にuseしてください


app/extensions/Facades/Hoge/Hoge.php

namespace Hoge;

use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Config;

class Hoge
{
/**
* @return string
*/

public function getHoge()
{
return get_class();
}
}


続いてServiceProvider, アクセサ


app/extensions/Facades/Hoge/Facades/Hoge.php

namespace Hoge\Facades;

use Illuminate\Support\Facades\Facade;

class Hoge extends Facade
{

/**
* Get the registered name of the component.
*
* @return string
*/

protected static function getFacadeAccessor()
{
return 'hoge';
}
}



app/extensions/Facades/Hoge/Provider/Hoge.php

namespace Hoge\Provider;

use Illuminate\Support\ServiceProvider;

class HogeServiceProvider extends ServiceProvider
{

public function register()
{
$this->app->bindShared('hoge', function($app) {
return new \Hoge\Hoge;
}
);
}
}


composer.jsonをデフォルトの状態で利用している方は、忘れずに実行しましょう。

php composer dump-autoload 

#またはphp composer.phar dump-autoload

providersに追加します


app/config/app.phpまたはapp/config/環境/app.php等

    'providers' => [

'Illuminate\Foundation\Providers\ArtisanServiceProvider',
'Illuminate\Auth\AuthServiceProvider',
'Illuminate\Cache\CacheServiceProvider',
// ~~~
'Hoge\Provider\HogeServiceProvider',
],

任意のcontrollerからcallしてみましょう。


任意のController.php

Hoge::getHoge();


という具合で簡単に作る事ができます。

Eloquentを使わずにQueryBuilderや、通常のDB::select() 愛用の方、

Database操作以外もmodelsに書く方(modelはDatabase操作専用じゃありませんよ!)は

Controllerからは普通に

protected $hoge;

public function __construct(\Model\Hoge $hoge){
$this->hoge = $hoge;
}

// もしくは
public function __construct(){
$this->hoge = App::make("\Model\Hoge");
}

で使ってる人が多いんじゃないかと思います。

*Testを考えたらnewするのもちょっとあれですよね

ロジックすべてをmodelsとしている方はFacadesを独自で作るという方はあまり居ないかもしれませんが、

Facadeを通じて使える様にすると、bladeからも使う事ができますので、

Utilみたいなのを作ったりとかするのがいいのではないかと