Laravel5でカスタムライブラリを利用する時のメモ。どこに置いて、どう使う?か。
結論から言えば、「こうしろ!」というのは無いみたい。たぶん。
###簡単編
どこでもいいので、置く。そして後はnamespaceを指定し、呼び出し。composerでロードする方法もあるが、とりあえずこれがあれば十分。
例えば、appにMyLibsフォルダを作り、その中にMyClass.phpを置く。
<?php namespace App\MyLibs;
class MyClass{
public function sayHello(){
return "Hello!";
}
}
これを呼び出すには、例えばルートにて、
Route::get('hoge',function(){
$hello = new App\MyLibs\MyClass;
return $hello->sayHello();
});
とする。もちろんuse App\MyLibs\MyClass;としてもよい。
###ファサードを作る
ある程度の規模なら、ファサード化したほうがLaravelっぽい。
・元クラスの作成
・サービスプロバイダの作成
・サービスプロバイダの登録
・サファードクラスの作成
・利用
という流れになる。
####元クラスの作成
めんどいので、上記のMyClassをそのまま使う。
####サービスプロバイダの作成
ひな形を作る。
php artisan make:provider HelloServiceProvider
ファサードクラスでgetFacadeAccessor()が返す文字列と、クラスをbindする。
<?php namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class HelloServiceProvider extends ServiceProvider {
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
$this->app->bind(
'hello',
'App\MyLibs\MyClass'
);
}
}
これだけ。
####サービスプロバイダの登録
config/app.phpにプロバイダを登録。
'providers'=>[
...
'App\Providers\HelloServiceProvider',
...
]
####ファサードクラスの生成
特定の場所はないようなので、とりあえずapp直下に作る。生成コマンドは無いようだ。
<?php namespace App;
use Illuminate\Support\Facades\Facade;
class Hello extends Facade
{
protected static function getFacadeAccessor(){
return 'hello';
}
}
####エイリアスの設定
折角なので\Hello::で呼べるようにしたい。config/app.phpのaliasesに追加する。
'aliases'=>[
...
'Hello' => 'App\Hello',
...
]
####利用
例えばルートにて、
Route::get('hoge',function(){
// $hello = new App\MyLibs\MyClass;
// return $hello->sayHello();
return \Hello::sayHello();
});
うーん。めんどい。これにより、ファサードクラスで戻る文字列を変更するか、サービスプロバイダでbindするクラスを変えれば、元コードを変更せずに機能を変えられる・・・。