Laravel9がついにでました。次の3つのレベルに分けて、17個の変更点や機能を紹介します。
- これは便利機能5選
- 知っておくとよいかも機能8個
- 知らなくてもよいかな機能4個
17個は多すぎですよね^^;
とりあえず、【これは便利機能5選】だけは、知っておいてください。
なお、今回ご紹介する機能は、下記の公式ドキュメントを参考にしています。
Laravel9は、通常どおりプロジェクトを作成するとインストールできます。利用にはPHP8.0以上が必要となります。インストール手順は、こちらの記事を参考にしてくださいね。
Laravel9:これは便利機能5選
まずは知っておくと便利!!機能のご紹介からです。
ルートの設定方法が便利になりました
これまで同じコントローラを使う場合でも、都度コントローラを入れる必要がありました。
1 2 |
Route::get('/posts', [PostController::class, 'index']); Route::get('/posts/show', [PostController::class, 'show']); |
Laravel9では、次のように、コントローラによってグループ化が可能になりました。
1 2 3 4 |
Route::controller(PostController::class)->group (function () { Route::get('/posts', 'index'); Route::get('/posts/show', 'show'); }); |
ルート設定がちょっとすっきりしますね。
ルート一覧が見やすくなりました
【Laravel8でのルート一覧】
1 |
php artisan route:list |
便利な機能ながら、Laravel8まではイマイチ一覧が見ずらいのが難点でした。Laravel9では、ルートの一覧が美しく、見やすくなりました。
これも、ちょっぴり嬉しい改善ですね。
スロット名のショートカットが利用可能に
こちらはコンポーネントを使う人には嬉しい機能。
これまでは、次のようにblade.phpファイルにスロット名をいれていました。
1 2 3 4 5 6 7 |
<x-alert> <x-slot name="title"> Server Error </x-slot> <strong>Whoops!</strong> Something went wrong! </x-alert> |
Laravel9から、次のようにスロット名を簡単に入力できるようになりました。
1 2 3 |
<x-slot:title> Server Error </x-slot> |
コンポーネント使う場合は、これ、便利です。
Checked, Selected Bladeディレクティブが利用可能に
これもなかなか、便利そうです。
@checkedディレクティブ、blade.phpファイル上でチェックボックスの入力がチェックであるかどうか判定できるようになりました。
1 2 3 4 |
<input type="checkbox" name="active" value="active" @checked(old('active', $user->active)) /> |
これまで@ifを使っていましたが、より簡単に指定できるようになった感じですね。
選択リストでの入力を判定する場合には、@selectedディレクティブを使えます。
エラー画面が美しくなりました。
エラーが起こったときに遭遇する画面が美しくなりました。
右側の設定から、明るくしたり、暗くしたりと見た目も変えられます。
Laravel9:知っておくと良いかも機能8個
次は「まあ、知っておくと良いかも」レベルの機能です。
Anonymous Migtration(匿名マイグレーション)
こちらは、Laravel8.37で既にリリースされていた機能となります。
これまではマイグレーションファイルにクラス名が入っていましたが、今後は、クラス名が入らなくなります。
「あ、しまった同じクラス名でファイル作っちゃった」なんてトラブルが発生しなくなります。
それほど大きな影響はないような気はしますが、苦い経験がある人には嬉しい改善かも。
Bladeのインラインテンプレートのレンダリング
レンダーメソッドによって、Bladeテンプレートの文字列をHTMLに変換できるようになりました。
ちょっと何を言っているか分かりにくい感じですが^^;
たとえば、ルート設定ファイルに次のように入れます。
【web.php】
1 2 3 |
Route::get('/test/', function(){ return Blade::render('Hello'); }); |
ブラウザにページを表示すると、文字列が反映されています。
引数を加えることも可能です。たとえば、ログインユーザーの名前を表示するには、次のようにします。
【web.php】
1 2 3 |
Route::get('/test/', function(){ return Blade::render('Hello, {{ $user->name }}', ['user' => auth()->user()]); }); |
ブラウザにページを表示すると、ログインユーザーの名前も反映されています。
これもちょっぴり便利かも、機能ですね。
強制スコープ
これまたちょっぴり説明がややこしいのですが、がんばって説明します!
ユーザーと投稿データがあるとします。
ふたつのデータは、リレーションを設定してあります。
ユーザーIDとポストIDを指定して、投稿ページを表示するようなルート設定を作るとします。
このとき、ルート設定で次のようにscopeBindingを使うと、ユーザーとポストに整合性がなければ表示しないようにできます。
【web.php】
1 2 3 4 5 6 |
use App\Models\Post; use App\Models\User; Route::get('/test/{user}/posts/{post}', function (User $user, Post $post) { return $post; })->scopeBindings(); |
たとえば、ユーザーID1番の人が、ポストID1番の投稿データを作成したとしますね。この場合は、ブラウザに、次のようにURLをいれると、ちゃんとデータを表示できます。
ですが、ユーザーID2番を指定して、ポストID1番の投稿データを表示しようとすると、エラーになります。
整合性がないと表示してくれなくする。ちょっと便利な機能です。
フルテキストインデックス
MySQLまたはPostgreSQLを使用している場合、fullTextメソッドをカラム定義に追加し、フルテキストインデックスを作れるようになりました。
たとえば、マイグレーションファイル作成時に、次のようにfullTextメソッドを設定します。
マイグレートを実行します。データベースの構造を見てみると、次のように【タイプ】がFULLTEXTとなっています。
次のようにwhereFullTextメソッドを使い、手早くインデックスを作成できます。
1 2 3 4 5 |
public function index() { $posts = Post::whereFullText('body', 'ある日のことでございます。')->get(); dd($posts); return view('post.index'); } |
実際に使う場があるかどうかは分かりませんが。
一応ご紹介でした。
アクセサとミューテータの記述方法の変更
アクセサとミューテータを使うと、データの加工を簡単にできます。
たとえば、毎回名前に敬称をつけたいとすると、Userモデルに次のようにアクセサをつけます。
【User.php】
1 2 3 4 |
public function getSanNameAttribute() { return $this->name.'さん'; } |
実際にこのアクセサを使いたいblade.phpファイル上で、次のように記述します。
1 |
{{$user->SanName}} |
すると、ブラウザ上に「さん」付でユーザー名が表示されます。
Laravel9では、このアクセサ・ミューテータを、次のようにプレフィックス(接頭辞)なく記述できるようになりました。
1 2 3 4 5 6 7 |
use Illuminate\Database\Eloquent\Casts\Attribute; (省略) public function SanName(): Attribute { return Attribute::get(fn()=>$this->name.'さん'); } |
分かりやすくなったのかもですが、正直、それほど便利になった感じはしません。
便利なヘルパ関数が加わりました
Laravel9では、便利なヘルパ関数が加わりました。
ヘルパ関数とは、PHPとは別に、Laravelが用意してくれているお助け関数です。
紹介していきますね。
ヘルパ関数:str
strは、指定した文字列を返してくれます。Str::ofメソッドと同等の機能を持ちます。
これまでは、次のように記述する必要がありました。
1 2 3 |
Route::get('/test/', function(){ return Str::of('junko')->append('/Laravel-lover'); }); |
Laravel9では、ヘルパ関数を使って、次のように記述できます。
1 2 3 |
Route::get('/test/', function(){ return str('junko')->append('/Laravel-lover'); }); |
ブラウザに表示すると、次のようになります。
まあ、ちょっぴり便利ってことで。
ちなみに表示する文字列には色々とルールを設定できます。次のようにsnakeを使うと、スネークケースに変換できます。つまり、単語と単語をアンダースコアでつなげられます。
1 2 3 |
Route::get('/test/', function(){ return str()->snake('LaravelLover'); }); |
ブラウザに表示すると、次のようになります。
ヘルパ関数:to_route
これまではリダイレクトを入れる時に、次のように記述しました。
【web.php】
1 2 3 |
Route::get('/test', function(){ return redirect()->route('welcome'); }); |
今後はヘルパ関数to_routeが加わったので、次のように記述することもできます。
【web.php】
1 2 3 |
Route::get('/test', function(){ return to_route('welcome'); }); |
引数がある場合は、次のような形で配列を入れます。
1 |
return to_route('dashboard', ['user' => 1]); |
Laravel Breeze API と Next.js
Laravel Breezeスターターキットには、「API」スキャフォールドモードとNext.jsフロントエンド実装が追加されています。
TailwindでBootstrap5のページネーションビューを使える
Bootstrap5を使って、ページネーションビューが作れるとのこと。
デフォルトのTailwindビューの代わりに、Bootstrap5のページネーションをビューを使うには、App\Providers\AppServiceProvider に、次のように入れます。
1 2 3 4 5 6 7 8 9 10 11 |
use Illuminate\Pagination\Paginator; /** * Bootstrap any application services. * * @return void */ public function boot() { Paginator::useBootstrapFive(); } |
なおページネーションは別の記事でも解説しているので、詳しくはこちらをどうぞ。
今回はBootstrap5という部分が違うのかもしれませんが、以前から使えたために、重要度低めの項目にいれました。
Laravel9:知らなくてよいかな機能4個
あくまでも、個人の感想です。
TestにCoverageオプション追加
php artisan testコマンドによって、テストが実行できます。
今回はこのコマンドに coverageオプションがつきました。これによって、コードカバレッジの量を調べられるようになりました。
Laravel Scount にデータベースエンジン追加
Laravel Scoutはデータベースのフルテキストサーチが可能になるパッケージです。
AlgoliaやMeiliSerachのような専用の検索サービスではなく、Scoutの「データベース」エンジンを利用することができるようになりました。
PHPのenumに属性値をキャストできる
PHP8.1ではEnumのサポートが導入されました。
Eloquentでは、属性値をPHPのenumにキャストすることができるようになりました。
またルート設定にEnumをタイプヒントする機能が導入され、LaravelはそのルートセグメントがURIの有効なEnum値である場合にのみルートを呼び出します。
バリデーションの改善:ネストされた配列データ
Rule::forEach メソッドによって、検証対象の配列属性の繰り返しごとに呼び出されるクロージャを受け取ります。
1 2 3 4 5 6 7 8 9 10 11 12 |
use App\Rules\HasPermission; use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rule; $validator = Validator::make($request->all(), [ 'companies.*.id' => Rule::forEach(function ($value, $attribute) { return [ Rule::exists(Company::class, 'id'), new HasPermission('manage-company', $value), ]; }), ]); |
地味だけど、ちょっと大事な変更点:言語ファイルの場所
最後に、地味ですが、知っておいたほうが良い変更点がひとつあるのでご紹介します。
ユーザーインターフェースなどを翻訳したファイルを入れる場所が変わりました。
以前はプロジェクトディレクトリ/resources/lang の中でしたが、Laravel9では、プロジェクトディレクトリ/langに変更されています。
翻訳ファイルをいれる時に、ご留意ください。
さいごに
以上です。
最後に感想としては、「Laravel8の時のような、ものすごい変化はなかったかも」です。
今回のバージョンアップは新機能搭載というよりも、環境への対応といった意味合いが強かったのではと感じます。
Laravelの作者、Taylorさんも、Twitterで次のようにつぶやいていました。
Laravelの作者、Taylorさんの投稿。
「メジャーリリースは、必要不可欠なことを行う、ちょっと退屈なもの。
言い換えると、クールな機能は年間通じて搭載していく感じ。」
適当な翻訳ですが😓
今後もどんどん開発が進むのが感じられますね😉 https://t.co/kwmsNVnSX5— Junko@Laravel大好きエンジニア (@laravel_junko) January 14, 2022
ただ言い換えると、メジャーバージョンアップを待たずとも、今後も新機能がどんどん加わっていくということですね。
Laravelの動向は今後も見守っていきます。
役立つことは記事にしますね。
Twitterでもつぶやいているので、良かったらフォローしてください♪
「実際にLaravel9を使ってWebアプリを開発してみたい!」という場合は、学習サイト【Laravelの教科書】をご活用ください。
Laravel9を使って、フォーラムサイトをいちから作る方法を解説しています。
ご興味あれば、下記ボタンをクリックして、案内ページを見てみてくださいね。
基礎編部分は無料でプレゼント中です♪