今回はLaravelの基本としてファサードを作成
通常クラスを作成した場合はuseでクラスを読み込みnewして利用するのが一般的だと思いますが、useやnewをしなくても使えるのがファサードです。システム内で共通で利用するようなクラスの場合メリットは大きいです。コードを省略できることで利用しやすくなり、スッキリして読みやすくなります。
ファサードは、LaravelのDocumentでは「アプリケーションのサービスコンテナで使用可能なクラスに対して「静的な」インターフェイスを提供します。」
ということで、サービスコンテナで利用可能なクラスを作成します。
次にそのクラスをファサード化していきます。
サンプルの題材は与えられた数字が素数かどうか判定するプログラムを作ります。
与えられた数字が素数ならTrueを返し、素数ではない場合はFalseを返します。
実用性はないですが関数内で完結していて静的クラスにしやすいのでw
素数かどうかを判定するクラスを作成
ここがロジック本体です。このクラスをファサード化していきます。
app\Components\PrimeNumber.php
<?php namespace App\Components; class PrimeNumber { /** * check * * 数値を渡し素数の場合はtrueそれ以外はfalseを返す * * @param int $num * @return bool */ public function check(int $num):bool { $sosu = true; for($i = 2; $i < $num; $i++) { if($num % $i == 0) { $sosu = false; break; } } return $sosu; } }
Facade化
続けてFacadeを作ります。
ファサード用のディレクトリとして\Facadesディレクトリを作成しそこにファイルを作成します。
app\Facades\PrimeNumberFacade.php
<?php namespace App\Facades; use Illuminate\Support\Facades\Facade; class PrimeNumberFacade extends Facade { protected static function getFacadeAccessor() { return 'check'; } }
サービスプロバイダの作成
サービスプロバイダに登録します。
artisanコマンドのが用意されているので実行しサービスプロバイダの雛形を作成します。
$ php artisan make:provider PrimeNumberServiceProvider
app\Providers\PrimeNumberServiceProvider.php
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use App\Components\PrimeNumber; // ←追加 class PrimeNumberServiceProvider extends ServiceProvider { /** * Register services. * * @return void */ public function register() { $this->app->bind('check', PrimeNumber::class); // ←追加 } /** * Bootstrap services. * * @return void */ public function boot() { // } }
サービスプロバイダの登録
Providerに登録します。
config\app.phpを編集
config\app.php
'providers' => [ .... App\Providers\PrimeNumberServiceProvider::class, //←追加 ],
エイリアスに登録
Aliasesに登録します
config\app.phpを編集
config\app.php
'aliases' => Facade::defaultAliases()->merge([ // 'ExampleClass' => App\Example\ExampleClass::class, ..... 'PrimaNumber' => \App\Facades\PrimeNumberFacade::class, //←追加 ])->toArray(),
以上でファサードは完成です
実行方法
コントローラから使うとき
.... echo \PrimeNumber::check(17) ? "素数です" : "素数ではありません";
とすることで実行できます。
コメント