🤔

Laravel 8の初学者躓きポイントまとめ【2020年】

2020/10/21に公開

はじめに

こんにちは、Vue.js + Laravel8.x をDocker上に構築して、以下資料を参考に学習した初学者です。
https://qiita.com/minato-naka/items/2d2def4d66ec88dc3ca2

今回はその中で修正が必要になったポイントを、最新版Laravelの変更点に絞って共有します。

Case1:: Class 'App\XXX' not found

migrationした際にモデル呼び出しに失敗する。

前提

  • artisanでmake:modelしている。
app/Models/XXX.php
<?php

namespace App\Models;
  • artisanでmake:seederしており、SeederにModelのuseをApp\直下で追加している。
database/seeders/XXXTableSeeder.php
<?php

namespace Database\Seeders;

use App\XXX;

原因

php artisan make:modelでModelを生成すると、
生成先やnamespaceがapp/XXXからapp/Models/XXXに変更になっているため、
過去コードを参考にした際に、namespaceがズレてしまう。

解決策

Seederに追加したuseの読み込み先を、正しいModelのnamespaceに直す。

XXXTableSeeder.php
use App\Models\XXX;

Case2:: Target class [XXXController] doesn't exist.

app/Http/Controllers/配下にAPIを定義しても、コントローラ呼び出しに失敗する。

前提

  • routes/api.phpにControllerのクラス名でルーティングを記載している。
routes/api.php
Route::get('/xxx', 'XXXController@index');
  • artisanでmake:controllerしている。
app/Http/Controllers/XXXController.php
# 内容は問わない

原因

app/Http/Controllers/がデフォルトのnamespaceから外れたため、
生成したControllerのnamespaceをルートから指定しないと読み込まれない。

解決策(いずれかを選択)

  • namespaceをルートから記載する。
routes/api.php
Route::get('/xxx', 'app/Http/Controllers/XXXController@index');
  • app/Providers/RouteServiceProvider.phpのnamespaceのコメントアウトを外す。
app/Providers/RouteServiceProvider.php
    /**
     * The controller namespace for the application.
     *
     * When present, controller route declarations will automatically be prefixed with this namespace.
     *
     * @var string|null
     */
    protected $namespace = 'App\\Http\\Controllers';

Discussion