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に必要な共通変数を作っていくことができます。