LaravelのFacade(ファサード)でオリジナルの処理クラスを定義する入門編
- 公開:
- 更新:
- カテゴリ: PHP Laravel
- タグ: PHP,Laravel,5.5,5.4,5.3,5.6,Facade,ServiceProvider
LaravelのFacade(ファサード)を使ってオリジナルのコンポーネントを作成します。
開発環境
今回の開発環境については以下の通りです。
- Linux CentOS 7
- Apache 2.4
- PHP 7.2
- Laravel 5.x
Laravelのバージョンについては5.6/5.5/5.4/5.3にて動作確認済みです。
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が出力されました。
まとめ
以上で作業は完了です。
今回はファサードの入門的な一連の流れを行いましたが、クラスの仕様によってはもっと詳細な設定なども出来てとても便利なので、是非試してみてください。