• トップ
  • ブログ一覧
  • Laravel 8.x のアップデート内容まとめ
  • Laravel 8.x のアップデート内容まとめ

    広告メディア事業部広告メディア事業部
    2021.02.09

    エンジニアになろう!

    Laravel 8.x 実装!

    2020年9月8日、Laravel が半年ぶりにアップデートされ、「バージョン8.x」が実装されました。

    ネットでは俄然 6.x の人気が高いようですが、最新バージョンの話題もちらほら見かけるようになりました。

    今回は、「Laravel 8.x のアップデート内容」について、コードも含めて紹介していきます!

    Laravel 8.x の主なアップデート項目

    今回取り上げる Laravel 8.x のアップデート内容は、以下の通りです。

    1. Laravel Jetstream
    2. Models ディレクトリの配置変更
    3. Model Factory がクラスに変更
    4. レート制限の改善
    5. route の変更
    6. .env の反映が即時に変更

    サポート期間

    Laravel 8.x のサポート期間は General です。

    LTS の最新バージョン 6.x と比較すると、サポート期間は以下のようになります。

    バージョンバグ修正サポートセキュリティサポート
    8.x2021年3月8日2021年9月8日
    6.x2021年9月3日2022年9月3日

    プロジェクト作成

    Laravel 8.x の新機能を実際に試していくため、あらかじめプロジェクトを作っておきましょう!

    1$ composer create-project laravel/laravel hogehuga 8.0

    Laravel Jetstream

    Laravel 8 では、新しい認証パッケージ「Laravel Jetstream」が追加されました。

    以前からあった LaravelUI を改善したもので、以下のような新機能を備えています。

    1. ログイン
    2. ユーザー登録
    3. メール認証
    4. チーム管理
    5. CSS フレームワークが TailwindCSS に変更

    Bootstrap に代わって採用された「TailwindCSS」は、class でスタイル指定する部分は同じものの、よりカスタマイズ性に重きを置いたフレームワークです。

    Jetstreamをインストール

    まずは、以下のコマンドで Jetstream を入れます。

    1$ composer require laravel/jetstream

    テンプレート言語の選択

    Jetstream では、フロントエンドを「Inertia」と「Livewire」から選択できます。

    フロントエンド使用するテンプレート言語
    InertiaVue.js
    LivewireLaravel Blade

    どちらも便利ですが、今回は SPA 向けの Inertia で進めていきましょう。

    ファイル構成は普通の Vue.js ですが、vue router ではなく、Laravel の route を使用します。

    Inertia をインストール

    1$ php artisan jetstream:install inertia
    1$ npm install && npm run dev

    マイグレーション

    1$ php artisan migrate

    resources/js/jetstream 下に .vue コンポーネントがたくさん作成されているので、確認してみましょう!

    teams を設定

    続いて、チーム機能を有効にします。

    1 'features' => [
    2Features::profilePhotos(),
    3Features::api(),
    4Features::teams(), //コメントアウトを外す
    5],

    インストール時に teams オプションを有効にしている場合は、初期状態からコメントアウトが外れています。

    コマンドは以下です。

    1$ php artisan jetstream:install inertia --teams

    メール認証を設定

    こちらも同様に、emailVerification() のコメントアウトを外しましょう。

    1 'features' => [
    2        Features::registration(),
    3        Features::resetPasswords(),
    4        Features::emailVerification(),
    5        Features::updateProfileInformation(),
    6        Features::updatePasswords(),
    7        Features::twoFactorAuthentication([
    8            'confirmPassword' => true,
    9        ]),
    10    ],

    完了!

    これで、jetstream の導入は完了です!

    registar から登録し、dashboard や profileを覗いてみましょう。

    Laravel 8.x 新機能の素晴らしさを実感できますよ!

    models ディレクトリパスが変更された

    Laravel 7.x 以前は、以下のように model を作成すると、 app 直下に MyModel が配置されていました。

    1$ php artisan make:model MyModel

    デフォルトでは Http やその他ディレクトリがある中にモデルファイルが生成されるので、とても違和感があるんですよね…。

    8.x では app/Models が初期フォルダ

    しかし、8.x では、初期状態から app/Models ディレクトリ が配置されています。

    そのため、上記のコマンドを使用すると、app/Models 直下に MyModel が生成されます。

    前の仕様に戻したい時は?

    この機能が気に入らない場合は、app/Models を削除してください。

    上記コマンド実行で、以前のように app 直下に MyModel が生成されます。

    Model Factory がクラスになった

    Model Facotry は、DB にデータをシーディングするためにあります。

    以前は function として定義されていましたが、クラスとして再定義されました。

    比べてみよう!

    7.x 以前

    1use Faker\Generator as Faker;
    2
    3$factory->define(App\User::class, function (Faker $faker) {
    4    static $password;
    5    return [
    6        'name' => $faker->name,
    7        'email' => $faker->unique()->safeEmail,
    8        'password' => $password ?: $password = bcrypt('secret'),
    9        'remember_token' => str_random(10),
    10    ];
    11});

    8.x

    1use App\Models\User;
    2use Illuminate\Database\Eloquent\Factories\Factory;
    3use Illuminate\Support\Str;
    4
    5class UserFactory extends Factory
    6{
    7    protected $model = User::class;
    8
    9    public function definition()
    10    {
    11        return [
    12            'name' => $this->faker->name,
    13            'email' => $this->faker->unique()->safeEmail,
    14            'email_verified_at' => now(),
    15            'password' => 'rasldjhg125thgnvmasda',
    16            'remember_token' => Str::random(10),
    17        ];
    18    }
    19}

    7.x 以前は factory ファイルで実装していたため、シーダー以外では使用できませんでした。

    しかし、8.x からはクラスベースでの実装となったため、他のファイルでも使用できるようになっています。

    新しく Factory を作る

    1$ php artisan make:factory MyFactory --model=Hogehuga

    レート制限の改善

    レート制限とは、アクセス制限のことです。

    総当たり攻撃(Brute-force attack)対策や、API を配信している側のサーバー負荷対策などで多く使われています。

    こちらも、かなり使いやすくなっていますよ!

    比べてみよう!

    7.x 以前は、以下のように Route::middleware で設定していました。

    1//1分あたり60回アクセスが可能
    2Route::middleware('auth:api', 'throttle:60,1')->group(function () {
    3    Route::get('/user', function () {
    4        //
    5    });
    6});

    8.x

    1use Illuminate\Cache\RateLimiting\Limit;
    2use Illuminate\Support\Facades\RateLimiter;
    3
    4RateLimiter::for('global', function (Request $request) {
    5    return Limit::perMinute(60);
    6});

    8.x では「RateLimiter::for」での設定に変更されました。

    こちらの方が分かりやすいですね!

    route の記述が変更

    route の記述も、以下のように変更されました。

    1Route::get('/user', [UserController::class, 'index']);

    改めて考えてみると、7.x 以前の記述は冗長だったような気もしますね…

    ちなみに、ネームスペースさえ付ければ 7.x 以前の指定でも大丈夫です!

    .env の変更が php artisan serve 時に自動で読み込まれる

    これまでは、php artisan serve でサーバーを実行した場合、.env の変更内容がすぐに反映されないため、手動で再起動する必要がありました。

    しかし、今回の変更により、再起動なしで .env の内容を自動で読み取ってくれるようになりました。

    git clone で Laravel プロジェクトの動作確認をする場合など、大いに役立ちそうな機能ですね!

    さいごに

    8.x では Laravel Jetstream を筆頭に、様々な追加や修正が行われています。

    今回紹介したもの以外にも、「タイムテストヘルパー」や「動的ブレードコンポーネント」などが実装されています。

    みなさんもぜひ、Laravel 8.x にトライしてみてくださいね!

    こちらの記事もオススメ!

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
    featureImg2020.08.14PHP 特集知識編PHPおすすめフレームワーク5選PHPでコードを書くならオススメの統合開発環境「PhpStorm」クラスから理解...

    広告メディア事業部

    広告メディア事業部

    おすすめ記事