Laravel Livewire公式トップに設置されている
リアルタイムユーザー検索を実装してみます。(機能だけ)


前提条件
- Laravelプロジェクト作成済
- Livewireインストール済
- Userモデルが使用可能な状態
※Jetstreamをインストールすれば上記条件をクリアできます。
Livewireコンポーネント作成
まずは環境の確認をしていきます。
livewireがインストールされているか確認します。
composer show | grep livewire

OKですね。
artisan コマンドで livewire が利用可能か確認します。
php artisan list | grep livewire

OKですね。
では、コンポーネントを作成します。
php artisan make:livewire search-user

あ、コンポーネントの名称を間違えました。
「search-user」ではなく「search-users」です。
作成したコンポーネントを削除します。
php artisan livewire:delete search-user

コンポーネントを作成し直します。
php artisan make:livewire search-users

クラスファイル編集
app/Livewire/SearchUsers.php
を編集・保存します。
Livewire公式トップページにあるコードをコピペします。

コピペした後に
use App\Models\User;
を追記します。
公式のコードでは「User::search($this->search)」
となっていますが、Userモデルの編集が面倒なので、
クラスファイル内で解決します。
完成コードは次の通りです。
<?php
namespace App\Livewire;
use Livewire\Component;
use App\Models\User;
class SearchUsers extends Component
{
public $search = '';
public function render()
{
return view('livewire.search-users', [
'users' => User::where(
'name',
'LIKE',
'%' . addcslashes($this->search, '%_\\') . '%'
)->get(),
]);
}
}
addcslashes()関数を使っている箇所は
次の記事を参考にしました
ビューファイル編集
resources\views\livewire\search-users.blade.php
を開いて編集・保存します。
Livewire公式トップページにあるコードをコピペします。

前回の記事でも書きましたが、
ビューファイルの内容は1組の<div></div>内に
全て書く必要があります。
完成形のコードは次の通りです。
<div>
<input wire:model.live="search">
@foreach ($this->users as $user)
<div>{{ $user->name }}</div>
@endforeach
</div>
ルーティング
routes/web.php
を開いて編集・保存します。
次のコードを追記します。
use App\Livewire\SearchUsers;
Route::get('/search-users', SearchUsers::class);

WEBサービス起動
前回の記事では、
resources/views/layouts/app.blade.php
を作成しましたが、今回は
Jetstreamインストール時に出来ているので割愛します。
sail でコンテナを起動します。
./vendor/bin/sail up

初回起動時なのでコンテナ群が生成されています。
ブラウザで確認
- http://localhost/search-users
へアクセスします。

ぐはぁっ。Exceptionスローです。
ビューコンポーネントでのエラーですね。
「$usersなんてプロパティはみつからないよ。」
と言われています。
なんか変だと思ったんですよね。
ビューファイルで「$this->users」って箇所。
「$this->」は要らないですよね。
resources\views\livewire\search-users.blade.php
を次のように修正・保存します。
<div>
<input wire:model.live="search">
@foreach ($users as $user)
<div>{{ $user->name }}</div>
@endforeach
</div>
ブラウザをリロードしてみます。

表示されました。。
が、フォームだけでユーザー名がありませんね。
ユーザー登録していないので当然ですね。
では、適当にユーザー登録してからリロードしてみましょう。

表示されました。
味気ないので、少し表示と制御を盛ってみましょう。
resources\views\livewire\search-users.blade.php
を再度編集・保存します。
<div>
<h1>Search Users:</h1>
<input wire:model.live="search" placeholder="Search Users">
@if (isset($users))
@foreach ($users as $user)
<div>{{ $user->name }} <{{ $user->email }}></div>
@endforeach
@else
<div>No users.</div>
@endif
</div>
では、ブラウザをリロードしてみます。

ほんの少しだけ盛れました。
では、検索キーワードを入力して動作確認してみます。

「h」を入力した直後に「hoge」と「huga」に絞られましたね。
ユーザー名についてあいまい検索をしているので、
「o」を入れたら「hoge」と「piyo」になる筈です。

OKですね。
今回はここまでです。お疲れさまでした。
- 0
- 0
- 0
- 0




コメント