Laravel8のBladeでComponentsを使ってみる

Laravel Laravel

Laravel8のBladeでComponentsを使ってみる

Laravel8がリリースされたということで、リリースノートを見てみました。
するとbladeでコンポーネントが作れるようになっているようだったので使ってみました。

公式のこちらの内容になります。

Components(コンポーネント)を作成する

コンポーネントを作成するときは、下記のコマンドを実行します。

php artisan make:component [コンポーネント名]

TestButtonというコンポーネントを作成してみました。
汎用的にボタンを表示するコンポーネントのイメージで作ってみたいと思います。

$ php artisan make:component TestButton
Component created successfully.

作成されたコンポーネント初期

app/View/Componentsの直下に付けた名前でComponentを継承したクラスができています。

app/View/Components/TestButton.php

<?php

namespace App\View\Components;

use Illuminate\View\Component;

class TestButton extends Component
{
    /**
     * Create a new component instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Get the view / contents that represent the component.
     *
     * @return \Illuminate\View\View|string
     */
    public function render()
    {
        return view('components.test-button');
    }
}

renderメソッドのviewヘルパーでbladeファイルと紐づけているようですね..
bladeのファイルはresources/views/components直下に配置されました。初期状態では下記のように作られています。

resources/views/components/test-button.blade.php

<div>
    <!-- I begin to speak only when I am certain what I will say is not better left unsaid - Cato the Younger -->
</div>

作成されたコンポーネント修正

コンポーネントを下記のように修正してみました。

app/View/Components/TestButton.php

<?php

namespace App\View\Components;

use Illuminate\View\Component;

class TestButton extends Component
{
    public $type;

    public $label;

    public $btnClass;

    public function __construct($type = 'primary', $label = null, $btnClass = '')
    {
        $this->type = $type;
        $this->label = $label;
        $this->btnClass = $btnClass;
    }

    public function render()
    {
        return view('components.test-button');
    }
}

修正内容としては、$type、$label、$btnClassの3つのプロパティを書いて、コンストラクタに渡すようにしました。
引数にはそれぞれ初期値を指定していますが、指定していない場合は必須パラメータになって、ない場合はエラーになるので注意が必要です。

ここで渡されて、プロパティに設定された値が、コンポーネントのblade内で引数として使用できます。

bladeのほうは下記のように修正してみました。

resources/views/components/test-button.blade.php

@if($label)
    <label>{{$label}}</label>:
@endif
<button class="btn btn-{{ $type }} {{ $btnClass }}">
    {{ $slot }}
</button>

$labelが渡されていたら、ラベルを表示するようにしています。
$typeはbootstrap4のボタンのタイプを指定するようにしました。(info, warning, primaryなど)
$btnClassは他に指定したいクラスがあれば、指定できるようにしています。

$slotには呼び出し元のタグに書かれた内容が表示されます。

コンポーネントを呼び出してみる

最初に$typeだけ指定して呼び出してみました。

<x-test-button type="warning">
   ワーニングなボタン
</x-test-button>

表示されました。

次に$typeはprimaryにして、$labelにtestを指定してみました。

<x-test-button type="primary" label="test">
    ラベル付きのボタン
</x-test-button>

表示されました!

次に$typeはinfoで$btnClassにbtn-blockを指定してみました。
$btnClassみたいにキャメルケースで書いている場合はbladeから指定するときに「btn-class」のようにハイフンで繋ぐようです。

<x-test-button type="info" btn-class="btn-block">
    infoでblockなボタン
</x-test-button>

表示されました!!

コンポーネント呼び出し時に、変数を渡したい場合

コンポーネントの引数として変数を渡したい場合は下記のようにします。

@php
    $label = "hagehoge"
@endphp
<x-test-button type="primary" :label="$label">
    ラベル付きのボタン
</x-test-button>

直前で$labelという変数に文字列を入れて、コンポーネントに渡してみました。
渡すときは:変数名=”$変数”で渡します。これでコンポーネントに変数の内容が展開されて渡されます。

終わりに

公式の内容を全て試せた訳ではないですが、すごく使えそうだなーと思いました。
bladeでもatomic design的な感じで書いていけそうですね…

コメント

タイトルとURLをコピーしました