【Laravel】ViewにMeta情報を渡す共通処理を実装する
話は飛躍しますが復習メモ。
DRY(Dont Repeat Yourself)の法則に則り、
共通処理や共通の変数については、何度も呼び出すのではなく
1度処理できるようにすると良い。
例えば、今回は全てのViewにHTMLへ埋め込む
Meta情報(titleやページ情報)を、共通処理にしたいとします。
Viewを呼び出すにあたり、共通経路はいくつかありますが
(親クラスやRouteなど)
auth認証など、毎回呼び出すものはMiddlewareが確実であり簡潔なので
全てのViewにデータを渡したい今回は
MiddlewareとView::shareメソッドを採用します。
※今回はDBにMeta情報全て入力済み、
MetaModelとmeta table使用の前提で進めていきます。
Middlewareを実際に作って、通し、実装する
①Middlewareを作る
php artisan make:Middleware GetMetaData //キャメルケース
緑色でsuccessと出ると、app/Http/Middlewareの下にGetMetaData.phpが
作成されているはずです。
②Middlewareを通す
Middlewareを使用するために、Kernel.phpで定義します。
今回は全てのViewに渡すとき、
つまりほとんどのHTTPリクエストに対応したいため
限定しない$middlewareプロパティへ追加します。
Kernel.php
protected $middleware = [ ... \App\Http\Middleware\GetMetaData::class //追加 ];
これで、全てのHTTPリクエスト時にGetMetaDataという
Middlewareが実行されるようになりました。
③Middlewareを実装する
それでは早速GetMetaDataの内容を実装していきます。
App/Http/Middleware/GetMetaData.php
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\View; //今回はView::shareを使用するので use App\Models\Meta as MetaModel; class GetMetaData { public function __construct() { $this->meta_model = new MetaModel; //MetaModelをインスタンス化 } public function handle(Request $request, Closure $next) { View::share(['meta' => $this->meta_model->getMetaData($request)]) //全てのViewに、metaという名前の配列を渡す ValueはMetaModelのgetMetaDataメソッドを呼び出す return $next($request); }
Meta.php
public function getMetaData($request)
{
$meta_id = $request[meta_id];
return $this->where('meta_id', $meta_id);
}
これで、Viewを表示するたびに
MetaテーブルからMeta情報を抽出する一連の流れが実装できました。
以上です。