Laravelのviewの共通パーツとして使うbladeのコンポーネントに、controllerで生成した変数を渡す方法を解説します!
ひと手間あるけど順番に説明するのでゆっくり読んでもらえたら理解できると思います!
コントローラで作った変数をviewのbladeコンポーネントまで渡す。
仮にこんなコントローラのメソッドからviewであるbladeに変数を渡していたとしましょう。
class SampleController
{
public function index()
{
$user = User::find(1);
return view('users.index', ['user' => $user]);
}
}
bladeコンポーネントは次のパスにあるとします。
app/resoureces/views/components/button.blade.php
blade
そのとき、bladeはこうします。
// users/index.blade.php
...
<x-button :user-name="$user->name" />
注意点としては:user-name
の部分は_(アンダースコア)は使えません!
その代わり-(ハイフン)を使いましょう!
コンポーネントの変数を受け取るにはこれだけではダメです。
次のようにatrisanコマンドで `Illuminate\View\Component` のCpomoentクラスを継承したButtonクラスを自動生成します。
ファイルの場所はApp/Views/Components/Button.php
に生成されます。
php artisan make:component Button
ハイフン区切りで:user-nameとしてbladeで設定した値はコンポーネントクラスのコンストラクタで$userNameというキャメルケースで受け取ることができます。
ここも仕様なので気をつけて。
それをクラス変数にコンストラクタで渡します。こうするとようやくbladeコンポーネント側で変数を扱えます。
class Button extends Component
{
public $userName;
/**
* Create a new component instance.
*
* @return void
*/
public function __construct($userName)
{
//
$this->userName = $userName;
}
/**
* Get the view / contents that represent the component.
*
* @return \Illuminate\Contracts\View\View|\Closure|string
*/
public function render()
{
return view('components.button');
}
}
ここまででやっと準備ができました。
// resources/views/components/button.blade.php
<button>{{ $userName }}</button>
ちなみに今回のようなボタンの文言を渡すケースではここまでやらなくとも渡す方法があります。
$slotという予約された変数を使います。
まず変数を渡すblade側では<x-button></x-button>の間に渡したい値を渡します。
// users/index.blade.php
...
<x-button>{{$user->name}}</x-button>
component側では$slotとして使うだけ。
blade componentsの仕様で$slotという変数に自動で文字列が渡されるようです。
たぶん文字列以外は使えないと思います。(たぶん)
// resources/views/components/button.blade.php
<button>{{ $slot }}</button>
ここまでLaravelでviewのbladeコンポーネントで変数を渡す方法でした!
Laravelの公式リファレンスだとこちら。
https://laravel.com/docs/9.x/blade#passing-data-to-components
https://laravel.com/api/9.x/Illuminate/View/Component.html