Livewire でページネーションを使うには?pagination

ショコラ
ショコラ

Livewire でページネーションを使うには?pagination

https://laravel-livewire.com/docs/2.x/pagination のページネーションを試そうとした話です。

もっさん先輩
もっさん先輩

手順

Laravel と Livewire をインストールして、ページネーションのサンプルプログラムを作成する手順。

  1. プロジェクト名(pagination)を決めて以下のコマンドを実行します。
curl -s https://laravel.build/pagination | bash

インストール時にプロジェクト名のディレクトリが作成されます。

  1. インストールの最後に sudo でパスワードの入力を求められます。

↓下のメッセージが表示されてインストールは終わります。

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them

Get started with: cd pagination && ./vendor/bin/sail up
  1. sail のエイリアスを定義します。
echo "alias sail='[ -f sail ] && sh sail || sh vendor/bin/sail'" >> ~/.bashrc
source ~/.bashrc

Laravel のインストールはここまで。

  1. 「sail up」でコンテナを起動します。
cd pagination && sail up -d
  1. ララベルのトップディレクトリで、Livewireパッケージ をインストールします。
sail composer require livewire/livewire
  1. 次のコマンドを実行して、paginationコンポーネント を生成します。
sail artisan make:livewire pagination
$ sail artisan make:livewire pagination
 COMPONENT CREATED  ?

CLASS: app/Http/Livewire/Pagination.php
VIEW:  resources/views/livewire/pagination.blade.php

次の 2つ のファイルが生成されます。

<?php

namespace App\Http\Livewire;

use Livewire\Component;

class Pagination extends Component
{
    public function render()
    {
        return view('livewire.pagination');
    }
}
<div>
    {{-- To attain knowledge, add things every day; To attain wisdom, subtract things every day. --}}
</div>

※因みに、render メソッド を定義しなくても livewire.pagination は呼び出されます。

<?php

namespace App\Http\Livewire;

use Livewire\Component;

class Pagination extends Component
{
}
  1. 生成された Paginationコンポーネント のクラスとビューを次のように置き換えます。
<?php

namespace App\Http\Livewire;

use Livewire\Component;
use Livewire\WithPagination;
use App\Models\Post;

class Pagination extends Component
{
  use WithPagination;

  public function render()
  {
    return view('livewire.pagination', [
      'posts' => Post::paginate(10),
    ]);
  }
}
<div class="m-10">
  @foreach ($posts as $post)
    {{$post->id}} {{$post->content}} {{$post->author}} {{$post->posted_date}}<br>
  @endforeach
  <div class="my-10">
    {{ $posts->links() }}
  </div>
</div>
  1. Postモデルを作成します。
sail artisan make:model Post
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;
}
  1. データを投入します。
sail mysql
CREATE TABLE posts(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,content TEXT,author TEXT,posted_date DATETIME);
INSERT INTO posts(content,author,posted_date) VALUES
('a','mossan','2022-10-1'),
('b','mossan','2022-10-2'),
('c','mossan','2022-10-3'),
('d','mossan','2022-10-4'),
('e','mossan','2022-10-5'),
('f','mossan','2022-10-6'),
('g','mossan','2022-10-7'),
('h','mossan','2022-10-8'),
('i','mossan','2022-10-9'),
('j','mossan','2022-10-10'),
('k','mossan','2022-10-11'),
('l','mossan','2022-10-12'),
('m','mossan','2022-10-13'),
('n','mossan','2022-10-14'),
('o','mossan','2022-10-15'),
('p','mossan','2022-10-16');
  1. resources/views/layouts/app.blade.phpファイル を作る為に、layoutディレクトリ を作成します。

「フルページコンポーネントは resources/views/layouts/app.blade.php の {{ $slot }} にレンダーされる」と見かけましたが、ここまでの手順で app.blade.phpファイル はできていませんでしたので作成します。

mkdir resources/views/layouts/
  1. resources/views/layouts/app.blade.phpファイル を作成します。
<!DOCTYPE html>
<html>
  <head>
    <script src="https://cdn.tailwindcss.com"></script>
    <meta charset="UTF-8">
    <livewire:styles />
  </head>
  <body>
    {{ $slot }}
    <livewire:scripts />
  </body>
</html>
  1. routes/web.php に Livewireコンポーネント のルートを追加します
Route::get('/',App\Http\Livewire\Pagination::class);
  1. ブラウザで確認します。

以上

ブートストラップに対応する。

  1. app/Http/Livewire/Pagination.phpファイル を修正します。
<?php

namespace App\Http\Livewire;

use Livewire\Component;
use Livewire\WithPagination;
use App\Models\Post;

class Pagination extends Component
{
  use WithPagination;
  protected $paginationTheme = 'bootstrap';

  public function render()
  {
    return view('livewire.pagination', [
      'posts' => Post::paginate(10),
    ]);
  }
}
  1. resources/views/livewire/pagination.blade.phpファイル を修正します。
<div>
  @foreach ($posts as $post)
    {{$post->id}} {{$post->content}} {{$post->author}} {{$post->posted_date}}<br>
  @endforeach
  {{ $posts->links() }}
</div>
  1. resources/views/layouts/app.blade.phpファイル を修正します。
<!DOCTYPE html>
<html>
  <head>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
    <meta charset="UTF-8">
    @livewireStyles
  </head>
  <body>
    {{ $slot }}
    @livewireScripts
  </body>
</html>
  1. ブラウザで確認します。

ブートストラップのボタンに変わりました。

以上

Scroll to Top