2022年2月9日。
いよいよLaravelの時期安定版、『Laravel 9』がリリースされました。
前回の安定版『Laravel6』は2019年9月リリースだったので、
実に2年5ヶ月ぶりになります。
今回の『Laravel 9』は、
- バグ修正が2024年2月まで
- セキュリティ修正は2025年1月まで
ということで長期に渡り運用することになりそうです。
『Laravel』ユーザーならおなじみの『Laracast』で
『Laravel 9』の追加変更点が解説されていたので、
備忘録も兼ねて整理することにしてみました。
Laravel9で追加変更 その1 ルーティング コントローラーグルーピング
これまでルートファイルでグルーピングする時は、
グループ内で毎回コントローラ名を書いていたのですが、
Route::controller[コントローラ名]と指定することで、
まとめて1つで書くことができるようになりました。
Route::controller(PostsController::class)->group(function(){ Route::get('/posts', 'index'); });
また、php artisan route:list の表示がシンプルになってみやすくなっています。
Laravel9で追加変更 その2 マイグレーションのクラス名が匿名に
データベースのテーブルを生成する『マイグレーション』ですが、
Php artisan make:migrate で作成した時のクラス名が変更になり、匿名になりました。
// Laravel 8 class CreateFailedJobsTable extends Migration { } // Laravel 9 return new class extends Migration { }
Laravel9で追加変更 その3 str() ヘルパ関数
文字列関連で、
Str:: というファサードがあったのですが、
よりシンプルに書けるように、str()という ヘルパ関数が追加されました。
//Laravel8 Str::of('hello world')->upper(); // 大文字に // Laravel9 str('hello world')->apper();
Laravel9で追加変更 その4 to_route() ヘルパ関数
データ保存後リダイレクトをかけたりする時に、redirectとrouteを組み合わせていたのですが、
to_route()というヘルパ関数を使うことでスッキリ書けるようになっています。
// Laravel8 return redirect()->route('home'); // Laravel9 return to_route('home');
Laravel9で追加変更 その5 例外ページの改善
例外を発生させた時の画面が若干見やすくなっています。
Route::get('/', function(){ throw new \Exception('Woops'); })
Laravel9で追加変更 その6 Blade::render
Blade::render() の中にBladeテンプレートを直書きできるようになったそうです。
Route::get('/', function(){ return Blade::render('{{ $greeting}}', @if (true) World @endif, ['greeting' => ''Hello'] ); })
Laravel9で追加変更 その7 scopeBindings
あるユーザーが投稿した記事なら表示、それ以外なら表示しないという場合、
Laravel8まではひと手間かかっていたんですが、
Laravel9では scopeBindings() をつける事で判定をかけてくれるようになりました。
// Laravel8 Route::get('/users/{user}/posts/{post:id}', function( User $user, Post $post){ return $post; }) // リレーションもつなぐ必要ある // Laravel9 Route::get('/users/{user}/posts/{post}', function( User $user, Post $post){ return $post; })->scopeBindings();
Laravel9で追加変更 その8 テストカバレッジ
テストに追加オプションで –coverageや–minが追加され、
各ファイルの実行結果などをわかり易く表示してくれます。
php artisan test --coverage php artisan test --min pecl install xdebug
Laravel9で追加変更 その9 Laravel Scoutでデータベース指定
全文検索ライブラリ、Laravel Scoutでデータベースも指定できるようになったようです。
composer require laravel/scout php artisan vendor:publish // configファイルを出力 >8 Copied File [scout.php to config/scout.php] .envに追記 SCOUT_DRIVER=database Modelのuse内に追記 use Laravel\Scout\Searchable; class Post extends Model { use HasFactory, Searchable; // Searchableを追記 public function toSearchableArray() { return [ 'title' => $this->title, 'body' => $this->body ]; } Route::get('/', function(){ return Post::search('xxx')->get(); // searchメソッドで検索結果表示 //return Post::search('xxx')->paginate(); })
Laravel9で追加変更 その10 full text indexing
データベースのインデックス設定も簡単になったようです。 // マイグレーションファイル内 $table->text(body')->fulltext(); // Tinkerで実施 Post::whereFullText('body', 'xxx')->count();
Laravel9で追加変更 その11 enum
EnumはPHP8.1で実装されていて、Laravel9でも実装できるようになっています。
// マイグレーション $table->enum('state', ['draft', 'archived', 'published']); // クラス (app/Enums/PostState.php) enum PostState { case Draft; case Published; case Archved; }
Laravel9で追加変更 その12 アクセサー・ミューテーションがシンプルに
データベースにデータを保存時にデータを加工したり、
取り出したりする時に表示を変えたりという場合に、
アクセサー、ミューテーターという機能があります。
以前は getXXXAttribute やsetXXXAttributeというメソッドを作る必要があったのですが、
Laravel9ではget, setで使えるようになり、1メソッドでそれぞれ設定できるので
シンプルに書けるようになっています。
// モデル protected $appends = [ 'path' ]; // Laravel8 public function getPathAttribute() { return route('posts.show', $this); } // Laravel9 その1 public function path(): Attribute { return Attribute::get(fn() => route('posts.show', $this)); } // Laravel9 その2 public function username(): Attribute { return new Attribute( get: fn($value) => ucwords($value), // アクセサー set: fn($value) => strtolower($value) // ミューテーター ); } // tinker $user = new User; $user->username = 'ABC'; // 大文字で登録すると $user > username: "abc"; // ミューテータ(set)がきいて小文字で設定されている
Laravel9で追加変更点をまとめてみて
Laravel8でJetStreamなど大きな変更が入ってからは、
長らくテスト、実験を経て、安定版になったのだろうと感じます。
細かい改善が多いのは、それだけ完成度が高いという事なんでしょうね。
PHP/Laravel講座
この記事へのコメントはありません。