LaravelでModel,Controllerを用いてViewに値を渡します。
Laravelをインストールしている前提で始めますが、インストールから始める方は下記を参照してください。
Model,Controller,Viewというのは設計パターンの1つであるMVCモデルの話をしています。
1つずつ簡単に説明すると、Modelはデータとそのデータに関する処理を行うコンポーネントです。
ViewはUIを表示するコンポーネント。
ControllerはModelとViewの間のデータのやり取りを制御するコンポーネントです。
システムをこの3つのコンポーネントに分けて監理することで保守性・拡張性の向上が見込めます。
LaravelでもこのMVCモデルが使われています。
これをどのように使うのか記載したいと思います。
適当なデータを取ってきて出力する簡単な処理を書きます。
データを取得するためのModelの作成
まずはDBからデータを取得するためのModelを作成します。
DBに下記のfriendsテーブルがあると仮定して進めます。
| friend_id | friend_name | friend_age | friend_birthdate |
| 1 | 田中太郎 | 55 | 2024/4/1 |
| 2 | 斎藤二郎 | 45 | 2024/3/2 |
| 3 | 佐藤三郎 | 35 | 2024/3/3 |
下記コマンドでapp/ModelsのパスにFriend.phpを作成します。
php artisan make:model friend
Model名は原則としてDBのテーブル名の単数形のキャメルケースとする必要があります。
原則に沿わない場合はコードを書き加える必要があることにご留意ください。
上記コマンドでapp/ModelsディレクトリにFriend.phpが作成されたはずです。
Friend.phpを編集します。
下記のprotected $fillableのところを書き換えます。
..
class Friend extends Model
{
..
protected $fillable = [
'friend_id',
'friend_name',
'friend_age',
'friend_birthdate'
];
protected $table = 'friends';
..
}
..は省略を表しただけで実際には記述しないでください。
$fillableに代入している値以外はデフォルトで記載されていますので、$fillableのみ簡単に説明しておきます。
$fillableは記載した項目の操作を許可します。
記載名はテーブルのカラム名と一致している必要があります。
ついでながらprotectedと記載するのは中身の書き換えを自身のクラスか継承したクラスに限定するためです。
この$fillableのみ記載すれば今回のお試しでは十分です。
画面表示のViewを作成する
Modelが作成できたため画面表示のためのViewを作成します。
LaravelのViewはBladeテンプレートを利用して作成します。
resources/viewsディレクトリ配下にBladeファイルを作成します。
cd resources/views
touch friend_list.blade.php
このbladeファイルは基本htmlで処理をLaravel特有の記法で書きます。
とりあえず下記の通り記載してください。
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<body>
<table>
@foreach ($requests as $request)
<tr>
<td>{{ $request->friend_id }}</td>
<td>{{ $request->friend_name }}</td>
<td>{{ $request->friend_age }}</td>
<td>{{ $request->friend_birthdate }}</td>
</tr>
@endforeach
</table> </body>
</html>
app()->getLocale()はLaravelでアプリケーションのロケールを取得するためのデフォルトの書き方です。
ついでながらロケールとは言語の設定情報です。
下記の@を使った書き方はLaravel特有の書き方です。
@foreach ( $requests->$request )
..
@endforeach
phpのforeachの処理をhtmlで実現できます。
$requestsはまだ説明していませんがControllerから渡す予定の配列を入れた変数です。
この配列の要素分だけ<tr>を繰り返します。
@foreach以外にも@phpや@if、@for、@includeなど他にたくさんの書き方があります。
ControllerでModel,Viewを使ってDBから取得した値を画面表示する
Model,Viewが作成できたため、Controllerでそれらを動かしDBの値を画面表示します。
下記を実行しControllerファイルを作成します。
php artisan make:controller friendListController
app/Http/Controllersパス配下にファイルが作成されます。
ファイルを下記の通り修正します。
<?php
namespace App\Http\Controllers;
use App\Models\Friend;
use Illuminate\Http\Request;
class friendListController extends Controller {
public function index (Request $request) {
# Friend Modelを利用してDBの値を取得
$friends = Friend::all()->sortBy('friend_id');
# friend_list Viewに遷移
return view ('friend_list', ['requests' => $friends]);
}
}
?>
簡単に説明していくと下記はControllerクラスを格納する名前空間を宣言しています。
namespace App\Http\Controllers;
名前空間はクラスを整理するための仕組みでLaravelのControllerクラスはこの名前空間を指定する決まりとなっています。
この指定があることで他ファイルでこのクラスを呼び出す場合は下記のように指定する必要があります。
use App\Http\Controllers\friendList;
次はuseでLaravelの各種ファサードを呼び出しています。
use App\Models\Friend;
use Illuminate\Http\Request;
ファサードは複雑な処理をシンプルにまとめたものを意味します。
App\Models\Friendは先ほど作成したModelです。
Illuminate\Http\Requestはhttpリクエストを処理するためのクラスです。
下記ではControllerクラスを拡張したfriendListControllerを作成しています。
Illuminate\Http\Request;class friendListController extends Controller {
..
}
そしてそのクラスにhttpリクエストを引数にして起動するindex Functionを設けています。
public function index (Request $request) {
..
}
index Functionの中ではまずFriend Modelを呼び出し、friendsテーブルの中身を全取得しています。
# Friend Modelを利用してDBの値を取得
$friends = Friend::all()->sortBy('friend_id');
Friend::all()がfriendsテーブルの中身全取得です。
->sortBy(‘friend_id’)で取得したしたデータのfriend_idでの並び替えを行なっています。
Modelから取得した値をfriend_listのViewに渡します。
# friend_list Viewに遷移
return view ('friend_list', ['requests' => $friends]);
return view (‘friend_list’);の書き方で指定のViewに遷移できます。
[‘requests’ => $friends]のように引数を書き加えることで値を渡せます。
$friendsの中身をrequestsに入れて渡しています。
これでControllerも完了です。
WebブラウザからControllerのFunctionを呼び出せるようにする
最後にControllerのFunctionをWebブラウザから呼び出せるようにします。
アプリケーションのルーティング設定を行えるweb.php(routes/web.php)を編集します。
このファイルでURLによるリクエストとControllerの処理を結びつけることができます。
このweb.phpに下記の通り記載します。
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\friendListController;
/* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */
Route::get('/', [friendListController::class, 'index']);
下記はRouteと先ほど作成したfriendListControtllerを呼び出しています。
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\friendListController;
LaravelにおけるRouteはURLリクエストとControllerの処理を紐づけるための仕組みです。
下記でそのRouteを用いて紐づけを定義しています。
Route::get('/', [friendListController::class, 'index']);
/へのgetリクエストが来たらfriendListControllerのindex処理を実行するよう定義しています。
web.phpはこれで記載できたのでURLを叩いてみましょう。
https://[ホスト名orIP]/[Laravel Projectのrootフォルダ名]/
画面にfriendsテーブルの値が表示されたら完了です。

