脱初心者備忘録

LaravelのBladeで共通の変数を使いたいとき

laravelを使ってて、HTMLの各パーツをviewsフォルダのlayoutsとかcomponentsとかのviewで共通に使いまわしたいときありますよね。例えば、サイドバーとかフッターに置いたメニューの中身とか。

そういう時に使えるのが共通変数です。色んなやり方があると思いますが、自分がやってる方法を記載します。

AppのViewにComposersを作る

まず、appフォルダのViewフォルダの中にComposersフォルダを手動で作成します。
今回はメニューを使いまわしたいので、MenuComposer.phpという名前でファイルを保存します。

下記をコピーして貼り付けます。

<?php
namespace App\View\Composers;

use Illuminate\View\View;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Schema;

class MenuComposer {

    public function __construct()
    {


    }

    /**
     * Bind data to the view.
     *
     * @param  \Illuminate\View\View  $view
     * @return void
    */
    public function compose(View $view)
    {

    }

    
}

MenuComposer.phpのコンストラクタを設定する

コンストラクタとcomposeを設定します。

表示されるURLによってカテゴリの中身を変えたいので、コンストラクタの引数にRequestを設定します。

GETリクエストでidが取得できれば、protectedのidにこれを代入します。

protected $id;//Routeで取得されるカテゴリのID

public function __construct(Request $request)
{

        $this->id = null;
        if (!empty($request->all())) {
        if(isset($request->id)) {
                   $this->id = $request->id;
               } 
            
        }
}

MenuComposer.phpのcomposeを設定する

ここがメインの部分。ビューで呼ばれるとこのメソッドが実行されます。

今回はコンストラクタで設定したIDによって、ビューに渡すカテゴリを変更するので、そのクエリを書きます。

(今回は、first_categoriesとsecond_categoriesというテーブルが存在しています。)

use App\Models\FirstCategory;
use App\Models\SecondCategory;

public function compose(View $view)
{
        $id = (int)$this->id;
        $menuCategories = [];

        if (isset($id)) {
            if (Schema::hasTable('second_categories')) {
                $menuCategories = SecondCategory::where('first_category_id', $id)
                    ->orderBy('sort_order')
                    ->get();
            }
        } else {
            if (Schema::hasTable('first_categories')) {
                $menuCategories = FirstCategory::orderBy('sort_order')->get();
            }
        }

        $view->with('menuCategories', $menuCategories);
}

View用のProviderを作成する

どのviewでも呼び出しできるように、View専用の変数を設定します。

まずProvidersにphpを作成します。

php artisan make:provider ViewServiceProvider

作成したら、bootの部分に呼び出しを書きます。

use Illuminate\Support\ServiceProvider;
use App\View\Composers\MenuComposer;
use Illuminate\Support\Facades\View;

   /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        View::composer('*', MenuComposer::class);
    }

これで、MenuComposer.phpに記載した、$menuCategoriesという変数で、どのviewからも呼び出せるようになりました。

同じような手順で、Viewに必要な共通変数を作っていくことができます。