Laravelを学習していて、use宣言の重要性に気づいたので記事にまとめました。
Laravel10で学習していたため、Laravel10の使用を前提としています。(新バージョンでも執筆時点ではこの点は変わっていないという認識です)
use宣言とは?
use宣言が何かを説明する前提として、MVCモデルについて簡単に説明します。
MVCモデルについて
LaravelはPHPのフレームワークで、「MVCモデル」という設計でアプリケーションを開発していきます。以下のように、役割を分担して記述していきます。
- M(モデル)
- データ処理関連。データベースとの連携。
- V(ビュー)
- ブラウザに表示される画面部分
- C(コントローラー)
- モデルとビューの橋渡しなど。ロジック部分。
この3つに加えて、
- ルーター
- リクエストをどのコントローラーのどのメソッドで処理するか割り振る も必要になります。
データ処理関連はモデルに記載されているため、データベースの情報を使って何かしようとするときは、コントローラーに「●●というモデルを使うよ!」というお知らせをします。また、ルーターでも「○○というコントローラーを使うよ!」と知らせる必要があります。
これが「use宣言」です。
use宣言をする
例えば、以下のような機能を持たせたいとします。
- 店のリストからお気に入り登録する
- 店の情報にはエリア情報が紐づけられている
- お気に入り登録した店を一覧表示する際、エリア情報も見たい
この場合、以下のような構成が考えられます。(ビューファイルは省略)
モデル | コントローラー | テーブル |
---|---|---|
Shop.php | ShopController.php | shops_table |
Area.php | AreaController.php | areas_table |
Favorite.php | FavoriteController.php | favorites_table |
各テーブルの情報を利用してビューファイルに表示させるには、まずモデルにリレーションの記述をします。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
~ リレーションのための記述 ~
モデルの中のuseはデフォルトで入ってくるものなのでそのままでOK。
リレーションのための記述(1対多など)を記載します。
コントローラーは以下のように記載します。ここでuse宣言です。
<?php
namespace App\Http\Controllers;
use App\Models\Shop;
use App\Models\Area;
~ 下記省略 ~
お店の情報にエリア情報を紐づけるためにareas_tableに入っているデータを利用したいです。この場合、Areaモデルを使用しますとuse App\Models\Area
でuse宣言しています。use宣言をすることにより、Areaテーブルのデータを利用した処理ができるようになります。
つまり、use宣言していないと他が完璧でもデータベースから情報を持ってくることができません!
店をお気に入り登録する際は、shops_tableの情報を利用したいです。
<?php
namespace App\Http\Controllers;
use App\Models\Favorite;
use App\Models\Shop;
~ 下記省略 ~
この場合、Shopモデルを使用しますとuse App\Models\Shop
でuse宣言しています。このように、使いたいモデルがあるときはuse宣言します。
ルーター(web.php)には、内容にもよりますがShopController
AreaController
FavoriteController
などの使用するコントローラーのuse宣言をします。
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ShopController;
use App\Http\Controllers\AreaController;
use App\Http\Controllers\FavoriteController;
~ 下記省略 ~
use宣言は書き忘れがち
use宣言は重要ですが、とにかく書き忘れがちです。(特に、後からモデルやコントローラーを追加したとき忘れがち…)
データが反映されない場合、ロジック部分やビューなどを見直しても原因不明なら、use宣言しているかもぜひ確かめてみてください。