LaravelのFacade(ファサード)でオリジナルの処理クラスを定義する入門編
- 公開日
- 更新日
- カテゴリ:Laravel
- タグ:PHP,Laravel,Facade,ServiceProvider
![LaravelのFacade(ファサード)でオリジナルの処理クラスを定義する入門編](/images/posts/88/thumbnail.png)
Laravel の Facade(ファサード)を使ってオリジナルのコンポーネントを作成します。
Contents
開発環境
今回の開発環境については以下の通りです。
- Laravel 5.6
Laravel のルートディレクトリを「laravel/」とします。
Facade(ファサード)
Laravel の機能の一つである Facade(ファサード)は、その仕組みを利用する事によりシンプルな処理群の集合を定義する事のできるものです。 CakePHP を使っている人なら、コンポーネントと言うと伝わりやすいかもしれません。ファサードを定義することによって、ある一定の機能・処理をまとめておき、シンプルな作法でコールする事が出来るようになります。
例えば PHP フレームワークには「ヘルパー関数」というものがあり、自作するという観点で見るとこれも考え方はファサードと同じです。全ての処理をコントローラに書かないようにしたい。 Laravel に機能があるものについてはそれらを駆使してコントローラをシンプル且つメンテナンスしやすいように保っていく。ただしそこに適当な機能が無かったら…。やはり「作る。」に行き着くと思います。ファサードもそうやって使っていくようなものだと考えると、わかりやすいかもしれません。
ゴール設定
せっかくなので、ゴールが見えやすいように作るもののテーマを決めます。
今回ですが、「hoge 」というテキストを出力する Hoge ファサードを作成していきます。
Hoge ファサードを使う事によって、hoge を簡単に出力できる。そんな夢のようなコンポーネントになります。
サービスプロパイダの作成
まずはサービスプロパイダを作成します。これは artisan コマンドで生成できます。 Laravel ルートディレクトリへ移動し、以下のコマンドを叩きます。
# Laravel ルートディレクトリへ移動
cd /path/to/laravel
# サービスプロパイダファイルを生成する
php artisan make:provider HogeServiceProvider
# 実行結果
[demo@localhost laravel]# php artisan make:provider HogeServiceProvider
Provider created successfully.
app/Providers 配下に HogeServiceProvider.php が生成されます。
laravel
├─ app
│ ├─ Providers
│ │ ├─ HogeServiceProvider.php
生成したサービスプロパイダクラスには、既に boot() メソッドと register() メソッドが定義されてあり、互いに中身は空っぽの状態です。
そのうちの register() アクションにて、今回登録する hoge クラスを以下のようにして記述し、サービスコンテナへ登録します。
- app/Providers/HogeServiceProvider.php
-
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class HogeServiceProvider extends ServiceProvider { /** * Bootstrap services. * * @return void */ public function boot() { // } /** * Register services. * * @return void */ public function register() { $this->app->bind( 'hoge', 'App\Http\Components\Hoge' ); } }
bind() メソッドの第一引数にはいわゆる識別子としての名前を渡し、第二引数には、対象となる独自処理クラスである Hoge クラスを渡します。
独自処理クラスの設置場所については、Laravel では厳格な決まりはありません。好きなところに置けます。今回は CakePHP チックに Controller と並ぶようにして配置することにして App\Http\Components配下にしようと思うので、パスはこんな感じになりました。
Facades クラスの作成
次に Facades クラスを作成します。
laravel/app 配下に Facades ディレクトリを作成し、その中に Hoge.php を作成します。
laravel
├─ app
│ ├─ Facades
│ │ └─ Hoge.php
そして、コンポーネントの登録名を取得する為のアクセサー getFacadeAccessor() メソッドを以下のように定義します。
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class Hoge extends Facade
{
protected static function getFacadeAccessor() {
return 'hoge';
}
}
異常にシンプルなクラスだと感じるかもしれませんが、サービスコンテナの結合名を返すことがこのクラスの役割なので、これで OK です。
独自処理クラスの作成
独自処理クラス、いわゆる自作コンポーネントを作成します。
laravel/app/Http 配下に Components ディレクトリを作成し、その中に Hoge.php を作成します。
laravel
├─ app
│ ├─ Http
│ │ ├─ Components
│ │ │ └─ Hoge.php
作成した Hoge.php を以下のように実装します。
- laravel/app/Http/Components/Hoge.php
-
<?php namespace App\Http\Components; class Hoge { public function echoHoge() { return 'HOGEHOGE'; } }
今回はシンプルに「HOGEHOGE 」の文字列を返すメソッドを実装しましたが、必要なものを use してデータベースと連携しても良いし、好きなように実装できます。
サービスプロパイダーとエイリアスの登録
最後に、サービスプロパイダとクラスのエイリアスを登録します。
- laravel/config/app.php
-
<?php return [ 'providers' => [ App\Providers\HogeServiceProvider::class, ], 'aliases' => [ 'Hoge' => App\Facades\Hoge::class, ], ];
追加分以外のコードは全て省略しています。
これで登録含め、自作コンポーネントが完成しました。
動作確認
一通りの実装が完了したので、コントローラの中で使ってみます。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Facades\Hoge;
class SampleController extends Controller
{
public function index()
{
Hoge::echoHoge();
}
}
自作コンポーネントである Hoge クラスを use し、処理の中で「クラス名+スコープ定義演算子+メソッド名」の形で Hoge クラスのメソッドを呼ぶことができます。
適当にルーティングを書いて、ブラウザからアクセスしてみます。
正常にコンポーネントの呼び出しが行われ、HOGEHOGE が出力されました。
まとめ
以上で作業は完了です。
今回はファサードの入門的な一連の流れを行いましたが、クラスの仕様によってはもっと詳細な設定なども出来てとても便利なので、是非試してみてください。