Laravel 7.xから導入されたクラスベースのコンポーネント機能を利用してみます。
本記事では、単純に「データベースのテーブルからデータを取得し表示させた部分」をコンポーネント化、すなわち部品化して作成してみます。
適当なテーブルを用意しておきます。今回利用するのは下記のようなbooksテーブルです。
1 2 3 4 5 6 7 8 9 10 |
mysql> SHOW COLUMNS FROM books; +------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------------+------+-----+---------+----------------+ | id | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | title | varchar(255) | NO | | NULL | | | author | varchar(255) | NO | | NULL | | | created_at | timestamp | YES | | NULL | | | updated_at | timestamp | YES | | NULL | | +------------+---------------------+------+-----+---------+----------------+ |
モデルの作成自体は下記ページをご覧ください。
次のコマンドで、クラスベースでのコンポーネントを作成します。
1 |
$ php artisan make:component BookList |
各Componentsディレクトリおよび2つのファイルが生成されるので、それぞれ下記のように追記します(ハイライト部分)。
app/View/Components/BookList.php
resources/views/components/book-list.blade.php
app/View/Components/BookList.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?php namespace App\View\Components; use Illuminate\View\Component; use Illuminate\Support\Facades\DB; class BookList 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.book-list'); } public function booklist() { return DB::table('books')->get(); } } |
30〜33行目
booksテーブルから全件のデータを取得しています。booklistという名前のメソッド名は次で説明するビューテンプレートにおいてそのまま利用できます。
resources/views/components/book-list.blade.php
1 2 3 4 5 6 7 |
<div> <ul> @foreach($booklist as $book) <li>{{ $book->title }}</li> @endforeach </ul> </div> |
ビューテンプレートです。コンポーネントにおいて定義したメソッドbooklistと一致する変数からbooksテーブルのレコードを取得しています。
コンポーネントを表示させるにはコンポーネントクラス(今回はBookList)のケバブケース(book-list)にプレフィックスとしてx-を付けたタグを利用します。下記タグを適当なBladeテンプレートに貼り付けるとbooksテーブルのtitleが表示されます。
1 |
<x-book-list /> |
タグからコンポーネントへ値を渡すことができます。下記ではlimitという属性を用意し、2という数値を指定しています。
1 |
<x-book-list limit=2 /> |
次にコンポーネントクラスを次のように修正します(ハイライト部分)。
app/View/Components/BookList.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?php namespace App\View\Components; use Illuminate\View\Component; use Illuminate\Support\Facades\DB; class BookList extends Component { public $limit; /** * Create a new component instance. * * @return void */ public function __construct($limit) { $this->limit = $limit; } /** * Get the view / contents that represent the component. * * @return \Illuminate\View\View|string */ public function render() { return view('components.book-list'); } public function booklist() { return DB::table('books')->limit($this->limit)->get(); } } |
コンストラクタにおいてlimitを定義し、booklistメソッドにおいてbooksテーブルから取得するレコード数として指定しています。
以上で下記のように2件のみが表示されるのが確認できます。
関連ページ
参照ページ