はじめに
何度か延期になりつつも、遂にLaravel9が公開されましたね!
早速ですが、今回はLaravel9について色々と試してみました。
詳しいドキュメントについては、以下の公式サイト(英語)をご確認ください。
他にも私のブログで、Laravelについて解説している記事がありますのでご覧ください。
【紹介】個人開発
私の個人開発ですがQuiphaというサービスを開発しました。(Laravel, Vue3など)
良かったら、会員登録して動作を試してみて下さい。
また、Laravel 9 実践入門という書籍を出版しました。
Kindle Unlimitedを契約している方であれば、読み放題で無料でご覧いただくことができます。
サポート期間
Laravel9はLTS(Long Term Support)であり、バグ修正は2年間、セキュリティ修正は3年間提供されます。
バージョン | PHP | リリース日 | バグ修正期限 | セキュリティ修正期限 |
---|---|---|---|---|
6(LTS) | 7.2 – 8.0 | 2019/09/03 | 2022/01/25 | 2022/09/06 |
8 | 7.3 – 8.1 | 2020/09/08 | 2022/07/26 | 2023/01/24 |
9 | 8.0 – 8.1 | 2022/02/08 | 2023/08/08 | 2024/02/08 |
Laravel8からのアップグレード
Laravel8で作成されたプロジェクトを、Laravel9へアップグレードするには、いくつかの対応が必要です。
PHP8が必須なのもあり、アップグレードについてはまだ試していませんが、対応コストは掛かりそうです。
私は、以下のサービスをLaravel8で作成しました。
Laravel9はまだ公開されたばかりですので、もう少し様子を見て、機会があればアップグレードしようと思います。
良かったら、会員登録して動作を試してみて下さい😊
プロジェクトの作成
早速、Laravel9のプロジェクトを作成してみましょう。
Laravel Sailを使って構築しますが、詳細につきましては以下の記事を参考にしてください。
以下のコマンドで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
Laravel SailでのXdebugの方法は以下の記事を参考にしてください。
やはりSailでの環境構築はとても楽です。
コマンド一つで、環境ごとプロジェクトを作成することができます。
ローカルPCに、ApacheやPHP、Composer、Node.jsをインストールすると、それらのバージョン違いのプロジェクトの同居が難しいです。
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のオススメ設定などは以下の記事をご覧ください。
新機能
新機能について、以下に詳細がまとまっていますが、個人的に気になった点をまとめてみました。
PHP8
Laravel9は、PHP8.0以降が必要です。
レンタルサーバーでPHP8が使えるものもありますが、まずは自分のサーバー環境が対応しているかどうかを確認する必要があります。
列挙型を使用したルートバインディング
PHP8.1では列挙型(enum)をサポートしており、Laravel9ではルーティングのバインディングに使用することができます。
<?php
namespace App\Enum;
enum Category: string
{
case Fruits = 'fruits';
case People = 'people';
}
GETパラメータの{category}が、「fruits」か「people」の場合のみ呼び出されます。
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');
});
全文検索対応
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');
}
};
マイグレーションを実行し、テーブルを作成します。
$ 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の場合です。
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を活用しましょう。
GitHub Copilot
GitHub Copilotを導入し、AIにコーディングをサポートしてもらうこともできます。
さいごに
Laravel9はLTSのバージョンですので、今後メインで使われていくでしょう。
どんどん便利になっていくフレームワークですので、ぜひ活用しましょう。
他にも私のブログで、Laravelについて解説している記事がありますのでご覧ください。
コメント