Laravel・PHP入門

未経験Ruby->PHPer初心者

【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情報を抽出する一連の流れが実装できました。


以上です。

参考:
ミドルウェア 5.5 Laravel