環境
Laravel 10 (8~)
TL;DR
$slot->toHtml()
の利用で受け渡した平文が取り出せるので
<x-item>
<x-slot name="label">いぬ</x-slot>
<x-slot name="link">dog</x-slot>
</x-item>
<a href="{{ route($link->toHtml()) }}">$label</a>
という形の実装ができました
が
class以外の属性の追加方法としてmergeメソッドを使った方法を公式が説明しており、href属性も渡せるので上方法は特に必要ないみたいです
Blade Templates - Laravel 10.x - The PHP Framework For Web Artisans
和訳様
Bladeテンプレート 10.x Laravel #非クラス属性のマージ
上コンポーネントを置き換えるとこうなりますね
<a {{ $attributes->merge(['href' => $link]) }}>$label</a>
以下全て蛇足
死んでもmergeしたくない!って人には有用かもしれませんがmergeメソッド使ったほうがいいと思います
コードはすっきりするかもですが
もし属性以外で平文を使いたい場面があったらご活用ください
目的
共通のコンポーネントにそれぞれのページへの簡潔なルート名を埋め込みたいんです
<x-item>
<x-slot name="label">いぬ</x-slot>
<x-slot name="link">dog</x-slot>
</x-item>
<x-item>
<x-slot name="label">ねこ</x-slot>
<x-slot name="link">cat</x-slot>
</x-item>
こんな感じで
<a href="{{ route($link) }}">{{ $label }}</a>
怒られる
Illegal offset type in isset or empty
(復唱)
route()へ渡すところで怒られが発生しているようです
ddしてみる
{{ dd($link) }}
ただの文字列ではなくComponentSlot
で渡っていたようです
その文字列が欲しい
$slot->contents
ComponentSlotやらを調べてみる
公式にありました
Illuminate\View\ComponentSlot | Laravel API
toHtml()
が使えそうですね
ちなみにマジックメソッドの__toString()
は内部でtoHtml()
を呼んでるだけのようでした
ということで
<a href="{{ route($link->toHtml()) }}">{{ $label }}</a>
でルート名の受け渡しで実装できました🐕🐈
余談
chatGPT先生に聞いたところ
<x-MyComponent>
<a href="{{ route('link1') }}">リンク1</a>
</x-MyComponent>
「aタグごと行け」
とのこと