LoginSignup
0
0

[Laravel10]Blade Componentで平文を渡したい

Last updated at Posted at 2023-09-12

環境

Laravel 10 (8~)

TL;DR

$slot->toHtml()
の利用で受け渡した平文が取り出せるので

oya.blade.php
<x-item>
    <x-slot name="label">いぬ</x-slot>
    <x-slot name="link">dog</x-slot>
</x-item>
component/item.blade.php
<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メソッド使ったほうがいいと思います
コードはすっきりするかもですが

もし属性以外で平文を使いたい場面があったらご活用ください

目的

共通のコンポーネントにそれぞれのページへの簡潔なルート名を埋め込みたいんです

oya.blade.php
<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>

こんな感じで

component/item.blade.php
<a href="{{ route($link) }}">{{ $label }}</a>

怒られる

スクリーンショット 2023-09-12 13.49.11.png

Illegal offset type in isset or empty
(復唱)
route()へ渡すところで怒られが発生しているようです

ddしてみる

{{ dd($link) }}

なんじゃこりゃ
スクリーンショット 2023-09-12 13.52.59.png

ただの文字列ではなくComponentSlotで渡っていたようです

その文字列が欲しい

$slot->contents

としたところ
スクリーンショット 2023-09-12 13.59.39.png
「エッチ!」
とのこと、すみません

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タグごと行け」
とのこと

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0