Laravel8でLivewireを試してみる:実践編

こんにちはコバヤシです。
今回は以前書いた記事「Laravel8でLivewireを試してみる」の実践編を書いていきます。 (Laravel9がリリースされましたが、8で進めます。。)

tech.arms-soft.co.jp

前回は、コンポーネントとviewで値を連動して表示するまでをやりました。 実践編ではフォームの入力値との連携をやっていきます。

Inputの値と連携する

Inputの値を連携するにはwire:modelを使います。

/app/Http/Livewire/Sample.php

<?php

public $sample;

/resources/views/livewire/sample.blade.php

<input type="text" wire:model="sample">
<p>{{ $sample }}</p>

wire:modelでコンポーネントのプロパティと連携され、それがすぐにviewに表示されます。
vue.jsのv-modelと同じ様な感じですね。

wire:model.debounce

通常、リクエストが多くなるのを防ぐために150msのデバウンス(待ち時間)で処理されます。
このデバウンスを変更するにはwire:model.debounceを使用します。

<input type="text" wire:model.debounce.300ms="sample">
<p>{{ $sample }}</p>

wire:model.lazy

通常のchangeイベントでリクエストが送られるようにするには、wire:model.lazyを使います。
(入力からフォーカスを外した時)

<input type="text" wire:model.lazy="sample">
<p>{{ $sample }}</p>

wire:model.defer

入力がある度にリクエストを送信せず、次のリクエストまで送信を処理待って値の更新を行うには
wire:model.deferを使います。以下では、更新ボタンを押すまでは値の更新が行われません。

<?php

public $sample;

public function update()
{
    // 何らかの処理
}
<input type="text" wire:model.lazy="sample">
<p>{{ $sample }}</p>
<button type="button" wire:click="update" >更新</button>

バリデーション

バリデーションを行うには、ruleの設定とvalidateメソッドを使います。

<?php

public $sample;

protected $rules = [
    'sample' => 'required|max:10000',
];

protected $messages = [
    'sample.required' => '入力してください',
    'sample.max' => '100文字以下で入力してください',
];

protected $validationAttributes = [
    'sample' => 'サンプル'
];

public function update()
{
    // バリデーション
    $this->validate();

    // 何らかの処理
}

エラーの表示は通常のbladeと同じ様に@errorを使います。

<input type="text" wire:model.lazy="sample">
<p>{{ $sample }}</p>
@error('sample')
<p class="error">{{ $message }}</p>
@enderror
<button type="button" wire:click="update" >更新</button>

コンポーネント内でエラーを取得するには、以下のようにします。

<?php
public function update()
{
    // エラーがあったら
    if($this->getErrorBag()->any()) {
       $error = $this->getErrorBag()->first('sample');
    }
}

まとめ

入力値の連携とバリデーションについて書いてきました。
vue.jsなどをやっていれば理解がしやすいのではないでしょうか。
次回はライフサイクルについて書いていきたいと思います。