自分だけのクイズ作成 - Quipha公開中

【Laravel9】概要・新機能・プロジェクト作成など試してみた

Laravel
スポンサーリンク

はじめに

何度か延期になりつつも、遂にLaravel9が公開されましたね!

早速ですが、今回はLaravel9について色々と試してみました。
詳しいドキュメントについては、以下の公式サイト(英語)をご確認ください。

Release Notes - Laravel - The PHP Framework For Web Artisans

他にも私のブログで、Laravelについて解説している記事がありますのでご覧ください。

【紹介】個人開発

私の個人開発ですがQuiphaというサービスを開発しました。(Laravel, Vue3など)
良かったら、会員登録して動作を試してみて下さい。

また、Laravel 9 実践入門という書籍を出版しました。
Kindle Unlimitedを契約している方であれば、読み放題で無料でご覧いただくことができます

是非多くの方に読んでいただき、Laravelの開発に少しでもお役に立てたら幸いです。

サポート期間

Laravel9はLTS(Long Term Support)であり、バグ修正は2年間、セキュリティ修正は3年間提供されます。

Laravel9の公開直後はLTSで公開されていましたが、無くなっていました。
またバグ修正期限、セキュリティ修正期限も変更になっています。

バージョンPHPリリース日バグ修正期限セキュリティ修正期限
6(LTS)7.2 – 8.02019/09/032022/01/252022/09/06
87.3 – 8.12020/09/082022/07/262023/01/24
98.0 – 8.12022/02/082023/08/082024/02/08
引用:https://laravel.com/docs/9.x/releases

今後も期間については変更される場合がありますので、最新情報は必ず公式サイトをご確認ください。

Laravel8からのアップグレード

Laravel8で作成されたプロジェクトを、Laravel9へアップグレードするには、いくつかの対応が必要です。

Upgrade Guide - Laravel - The PHP Framework For Web Artisans

PHP8が必須なのもあり、アップグレードについてはまだ試していませんが、対応コストは掛かりそうです。

私は、以下のサービスをLaravel8で作成しました。
Laravel9はまだ公開されたばかりですので、もう少し様子を見て、機会があればアップグレードしようと思います。

良かったら、会員登録して動作を試してみて下さい😊

スポンサーリンク

プロジェクトの作成

早速、Laravel9のプロジェクトを作成してみましょう。

Laravel Sailを使って構築しますが、詳細につきましては以下の記事を参考にしてください。

Windows
Mac

以下のコマンドでLaravelプロジェクトを作成します。(Laravel8と同様)
「example-app」の部分はプロジェクト名ですので、任意で指定します。

curl -s https://laravel.build/example-app | bash

続いて、以下のコマンドでLaravel Sailを起動します。

cd example-app
./vendor/bin/sail up -d

以下のURLにアクセスしましょう。

http://localhost/

いつものLaravel起動画面が表示されました、Laravel8と同じですね。
右下のバージョンがv9.xになっていることが確認できます。

各種バージョンの確認

Laravelのバージョン

以下のコマンドでLaravelのバージョンを確認します。
Laravel9になっていることが確認できました。

$ sail artisan -V

Laravel Framework 9.0.0

以降、念のためSailで構築した環境の各種バージョンを確認してみます。

PHPのバージョン

以下のコマンドでPHPのバージョンを確認します。
Xdebugが導入されていることが確認できます。

$ sail php --version

PHP 8.1.1 (cli) (built: Dec 31 2021 07:26:38) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.1, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.1, Copyright (c), by Zend Technologies
    with Xdebug v3.1.2, Copyright (c) 2002-2021, by Derick Rethans

PHPのバージョンについては、Sailのカスタマイズで変更可能です。

Laravel SailでのXdebugの方法は以下の記事を参考にしてください。

やはりSailでの環境構築はとても楽です。
コマンド一つで、環境ごとプロジェクトを作成することができます。

ローカルPCに、ApacheやPHP、Composer、Node.jsをインストールすると、それらのバージョン違いのプロジェクトの同居が難しいです。

Laravel Sailの場合、環境はDockerコンテナに作成されますので、同一PCにPHP7 or PHP8やMySQL or MariaDBのように、別々の環境のLaravelプロジェクトを簡単に作ることができます。

Composerのバージョン

Composerのバージョンを確認しましょう。

$ sail composer -V

Composer version 2.2.4 2022-01-08 12:30:42

Nodeのバージョン

Nodeのバージョンを確認しましょう。

$ sail node --version

v16.13.2

VS Codeの設定

今回はPHP8.1の新機能である列挙型の確認をしてみます。
実際に定義をしてみると、以下のようにシンタックスエラーになりました。

VS Codeの設定を開き、intelephense.environment.phpVersionと入力します。
PHPの拡張機能のPHPのバージョンを指定できますが、デフォルトで「8.0.0」が入力されています。
今回のPHPバージョンに合わせて、「8.1.1」に変更しました。

再度ソースコードを確認すると、今度はエラーが表示されなくなりました。

その他、VS Codeのオススメ設定などは以下の記事をご覧ください。

スポンサーリンク

新機能

新機能について、以下に詳細がまとまっていますが、個人的に気になった点をまとめてみました。

Release Notes - Laravel - The PHP Framework For Web Artisans

PHP8

Laravel9は、PHP8.0以降が必要です。

レンタルサーバーでPHP8が使えるものもありますが、まずは自分のサーバー環境が対応しているかどうかを確認する必要があります。

列挙型を使用したルートバインディング

PHP8.1では列挙型(enum)をサポートしており、Laravel9ではルーティングのバインディングに使用することができます

app\Enum\Category.php
<?php

namespace App\Enum;

enum Category: string
{
    case Fruits = 'fruits';
    case People = 'people';
}

GETパラメータの{category}が、「fruits」か「people」の場合のみ呼び出されます。

それ以外の場合は、404の応答が返されます。

route\web.php
use App\Enum\Category;

Route::get('/categories/{category}', function (Category $category) {
    return $category->value;
});

列挙型の定義通りのURLにアクセスしてみましょう。

http://localhost/categories/fruits

画面には「fruits」と表示されました。

逆に存在しない値を指定してみます。

http://localhost/categories/xxx

404エラーが返却されました。

予め受け取るパラメータの内容が決まっている場合は便利ですね。

ルートのコントローラグループ

ルーティングについて、Laravel8までは以下のような記述をしていました。

use App\Http\Controllers\OrderController;

Route::get('/orders/{id}', [OrderController::class, 'show']);
Route::get('/orders', [OrderController::class, 'store']);

CRUDもそうですが、一つのコントローラに多くの関数がある場合、記述が面倒です。
また、本格的に実装していくと悩ましいのですが、どんどんコントローラを作成し、ルートを定義していくと、かなり見づらくなっていきます。

実際にコントローラを作成してみましょう。

$ sail artisan make:controller OrderController

Laravel9では、以下のように同じコントローラをグループにすることができ、毎回コントローラクラスを指定する必要がありません。

use App\Http\Controllers\OrderController;

Route::controller(OrderController::class)->group(function () {
    Route::get('/orders/{id}', 'show');
    Route::post('/orders', 'store');
});

これにより記述量もぐっと減りますし、コントローラ単位で定義できますのでweb.phpが見やすくなりました。

全文検索対応

migrationファイルで、FULLTEXT INDEXを生成できるようになりました。

実際に試してみましょう。
以下のコマンドでmigrationファイルを用意します。

$ sail artisan make:migration create_products_table

migrationファイルが作成されましたので、以下のように修正しました。(ファイル名は現在時刻)

database\migrations\2022_02_09_132415_create_products_table.php

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->id();

            // 追加
            $table->text('name');
            $table->text('describe')->fullText();

            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('products');
    }
};

小さい変更ですが、マイグレーションクラスが、無名クラスに変更されています。
Laravel8ではテーブル名がクラス名に含まれておりました。

マイグレーションを実行し、テーブルを作成します。

$ sail artisan migrate

phpMyAdminから確認しましょう。
作成したテーブルに、FULLTEXT INDEXが生成されています。

Laravel SailにphpMyAdminを導入する方法は、以下をご覧ください。

使用する際は、以下のように記述します。

$products = \DB::table('products')
    ->whereFullText('describe', '検索ワード')
    ->get();

実際に生成されるSQL文を、ログファイルに出力して確認してみます。

\DB::enableQueryLog();

$products = \DB::table('products')
    ->whereFullText('describe', '検索ワード')
    ->get();

\Log::debug(\DB::getQueryLog());

MATCH .. AGAINST .. 構文が使用されているのが確認できました。

array (
  0 => 
  array (
    'query' => 'select * from `products` where match (`describe`) against (? in natural language mode)',
    'bindings' => 
    array (
      0 => '検索ワード',
    ),
    'time' => 1.74,
  ),
) 

Bladeのslotの名前

Bladeでx-slotの名前を指定する場合は、name属性に指定していました。

<x-alert>
    <x-slot name="title">
        Server Error
    </x-slot>

    <strong>Whoops!</strong> Something went wrong!
</x-alert>

Laravel9では以下のように短く記述することができます。

<x-slot:title>
    Server Error
</x-slot>

スタックトーレス画面

エラー時のスタックトレース画面がLaravel8から変更になっていました。

ダークモードやエディタの変更ができました。

Bootstrap5のページネーションの見た目

Laravelでは標準でページネーションの機能提供されています。

ページネーションのページ番号については、Bootstrapを使用している場合、以下のように関数を呼ぶことにより、Bootstrapの見た目に対応することができました。

以下は、Bootstrap4の場合です。

app\Providers\AppServiceProvider.php
use Illuminate\Pagination\Paginator;

/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
    Paginator::useBootstrap();
}

以下のコードをBladeに記述するとページネーションが表示されますが、Bootstrap風になりました。
($xxxはデータ一覧の変数例)

{{ $xxx->links() }}

もしBootstrap5をベースにデザインを構築している場合は、以下の関数を呼び出すことにより、ページネーションの見た目を変更できるようです。(動作未確認)

use Illuminate\Pagination\Paginator;

/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
    Paginator::useBootstrapFive();
}

ルート一覧の表示

ルート一覧は以下のコマンドで確認できます。

$ sail artisan route:list

これまでは以下のような出力でした。
横に長すぎて、改行されてしまいました。

+--------+----------+---------------------+------+------------------------------------------------------------+------------------------------------------+
| Domain | Method   | URI                 | Name | Action                                                     | Middleware                               |
+--------+----------+---------------------+------+------------------------------------------------------------+------------------------------------------+
|        | GET|HEAD | /                   |      | Closure                                                    | web                                      |
|        | GET|HEAD | api/user            |      | Closure                                                    | api                                      |
|        |          |                     |      |                                                            | App\Http\Middleware\Authenticate:sanctum |
|        | GET|HEAD | sanctum/csrf-cookie |      | Laravel\Sanctum\Http\Controllers\CsrfCookieController@show | web                                      |
+--------+----------+---------------------+------+------------------------------------------------------------+------------------------------------------+

Laravel9では以下のように見た目が改善され、Laravel8より見やすくなりました

Langフォルダの変更

新機能ではありませんが、Laravel9になり、Langフォルダの場所が変更になっています。
それに伴い、Laravel8からの移行や、既存のComposerパッケージを使用するにあたり、注意が必要です。

詳しくは以下の記事をご覧ください。

他にも沢山の新機能がありますが、気になった点は今後もまとめていきたいと思います。

その他

初学者へ

Laravelを初めて触る方へ向け、手順やアドバイスをまとめました。

外部サーバーへ公開

作成したアプリは公開して使ってもらいましょう!
Laravelアプリケーションを外部公開する方法をまとめました。

脆弱性対策

脆弱性を抱えたアプリケーションの場合、攻撃を受ける可能性があり大変危険です。
作成したアプリケーションは、脆弱性対策も意識しましょう。

GitHubと連携

GitHubと連携する方法を解説しました。
プロジェクトの管理はGitHubを活用しましょう。

さいごに

Laravel9はLTSのバージョンですので、今後メインで使われていくでしょう。
どんどん便利になっていくフレームワークですので、ぜひ活用しましょう。

他にも私のブログで、Laravelについて解説している記事がありますのでご覧ください。

\オススメ/

コメント

タイトルとURLをコピーしました