https://d226lax1qjow5r.cloudfront.net/blog/blogposts/laravel-9-strap-in/laravel-9.png

ララベル9:ストラップ・イン

最終更新日 February 23, 2022

所要時間:1 分

1年前から取り組んできたLaravel 9が、2月8日についに出荷されました:Laravel 9の登場です!この記事では、いくつかの新機能を紹介しますが、「もののリスト」ではなく、私の目に留まった変更点について、解説と補足説明をします。

ビッグ・スタッフ

大きなアーキテクチャの変更や後方互換性の警鐘を鳴らすような変更はない(とはいえ、これはメジャーリリースであるため、次のような変更も含まれている)。 semver).しかし、コードの外側に大きな変更がいくつかあります。それを見ていこう:

リリースサイクル

最近Laravelの中で最も大きな変化の1つは、Taylor Otwellが1年ごとのリリースサイクルに移行すると発表したことです。これは、コアチームが symfony のエコシステムまたはコミュニティが作成した依存関係のアップグレードをチェックする時間をより多く取れることを考えると、理にかなっています。symfony といえば:

symfonyメーラー

SymfonyメーラーがSwiftメーラーに取って代わりました。Symfonyの話題に関連して、PHPUKの間にSensioLabsの人々とLaravelとSymfonyの相互作用についてとても興味深い会話をしました。開発者の中には、自分たちがどちらか一方のブランド大使であると考え、それが標準的な "味方をする "ことだと思いたい人もいるかもしれません。 artisan cliやSymfony Mailer、Laravelの他の部分からわかるように、2つのフレームワークが協力し合っていることは明らかです。両者が Fabien PotencierTaylor Otwellが互いの組織にコードを提供していること、そしてPHPエコシステム全体がそのおかげで現代的な関連性と方向性を持っていることを思い出す価値がある。

PHP8

を見たことを覚えている。 ジェニー・ウォンHuman MadeのJenny WongがWordPressのセキュリティについて講演するのを見たのを覚えている。 JetpackのローリングがWordPressのエコシステムにとって不可欠なツールであったことを、非常に低い普及率にもかかわらず、私は覚えている。PHPが直面している最大の脆弱性の1つは、開発者がPHPのバージョンを上げようとしないことです。その時点でWordPressシーンの50%以上が、サポートされていないPHPバージョンでソフトウェアを実行していました。

そのため、LaravelがコアPHPのライフサイクルに合わせて、必要なPHPのバージョンを上げていることは、大きな後押しです。これにより、全く新しいAPI機能を利用できるようになりますが、さらに重要なのは、PHP8の最低バージョンを強制することで、JIT(Just-In-Time)ランタイム・コンパイラを利用できるようになり、Laravelのパフォーマンスが大幅に向上します。

新しい最低要件が追加されると、サーバースタックに引っかかるかもしれない。既存のアプリケーションのデプロイメントがあるため、それが深刻な苦痛であるなら、私はぜひ Laravel Shiftを使ってプロジェクトを自動的に移行することを強くお勧めします。

フライシステム

Laravelに入門した開発者として、最高の特徴の一つは StorageファサードがFrank De JongのFlysystemを包んでいることです。ドライバを切り替えることで、ファイルシステムのドライバをローカルからAWSのS3バケットに切り替えることができます:

Storage::disk('local')->put('something.jpg', 'Images'); Storage::disk('s3')->put('something.jpg', 'Images');

Flysystem 3.0.0は1月14日にリリースされ、Laravelの最小要件であるPHP8(特にFlysystem 8.0.2)に合わせたバージョンアップと、以下のようなディレクトリナビゲーションに関するAPIの機能強化が含まれています。 FilesystemReader::directoryExists('Storage\Images')

Laravel 9はFlysystem 3を使用するようになりました。

小さなもの

これらの微調整や追加機能は少し小さいが、それにもかかわらず、新機能の素晴らしいパッケージとなっている。

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

ウェブアプリケーションでルートを整理するとき、私はとてもこだわりがある。これは、1000以上のエントリを持つ巨大なルートファイルを見た経験からきていると思います。私が好きなルーティングのアプローチ方法は、Routes Serviceプロバイダによって読み込まれた、個々のコントローラ用のディレクトリ構造を使用することです。

私はすでにルートを名前付きグループとしてコーディングしていますが、ここでの違いは、クロージャによってグループを特定のコントローラにバインドできることです。しかし、例えば標準的なCRUD操作を行うREST APIのようなものを持っている場合、これはコード上でとても素敵に見えます。たとえば、次のようなコントローラです:

Class ReportController extends Controller
{
	public function index(){}
	public function store(){}
	public function delete(){}
	public function show(){}
}

コントローラのグループ化によって、コントローラのメソッドをroutesファイルでラップできるようになりました:

Route::controller(ReportController::class)->group(function () {
	Route::get('/reports', 'index');
	Route::post('/reports', 'store');
	Route::delete('/reports/{id}', 'delete');
	Route::get('/reports/{id}', 'show')
}

ルートリストCLI出力

ルートといえば routes:listの出力が変更され、より開発者にやさしい表示になりました:

Screenshot of the new route list output from Laravel's console

強制スコープ・バインディング

これは、ルートバインディング内のモデルのリレーションシップを、より明確な実装で結びつける、ちょっとした変更です。以前は、子レコード内にカスタムキーを追加することで、強制的なスコープバインディングを実現することができました:

Route::get('/users/{user}/reports/{report:id}', function (User $user, Report $report) {
	return $report;
})

つまり、ユーザとレポートが有効なキーである限り、たとえリレーションシップがなくても、例のエンティティが返されます。 $reportを返すことになります。 Model::hasOne(User::class))

このロジックをはるかに明確な方法で実現するメソッドが登場した:

Route::get('/users/{user}/reports/{report}', function (User $user, Report $report) {
	return $report;
})->scopeBindings();

列挙

PHP8.1 では、新しい enumsこのクラスは、静的に呼び出される戻り値を持つオブジェクトとして扱うこともできますし、値を含む "バックされた列挙" とすることもできます。 PHPUK2022のステージでDerek Rethansがこの機能を紹介するのを見ました。Vonageの立場から言わせてもらうと、これは非常に便利な機能だ。私たちは音声通話やメッセージングを扱っているので、これらの機能の多くは PHP SDKには、状態を定義したり取得したりするための静的プロパティがあります (たとえば、この SMS の状態は "0" です)。列挙型は、静的プロパティの広範なリストではなく、関連する型を持つ可能性があります。

Enumの導入により、Laravel 9のいくつかの機能は、これを利用するために書かれました。

属性キャスト列挙型

私はあるプロジェクトに携わったことがある。かなり大きなMySQLデータベースのすべてが、"Event "ベースクラス/データベーステーブルから拡張され、拡張エンティティはMySQLの列挙型によって制限されていました。問題ないでしょう?プラットフォームを拡張すると、新しい列挙型を追加する必要があり、数億のレコードを持つ1つのテーブルのインデックスを再作成する必要がありました。そのたびに転倒した。

列挙型テーブルのカラムに対するマイグレーションをどのように書くかを考えてみよう:

$table->enum('eventType', ['SpotifyEvent', 'VideoEvent', 'AppleEvent'])

新しい列挙型を追加するたびに、新しいマイグレーションを行う必要があります。

Laravel 9では、代わりにenumクラスを指定し、ロジックをデータベースではなくバックエンドのコードに保持することができます。データベースの観点からは、非効率なストレージというデメリットがありますが、より読みやすいコードになることは間違いありません。そのため、あなたのマイグレーションは代わりにvarcharカラムになるでしょう:

$table->string('eventType')->default('SpotifyEvent');

そして、あなたのロジックは、モデル内部で参照される、バックされた列挙型クラスの中に置かれます。 $casts配列の中で参照されます:

enum EventType: string {
	case SpotifyEvent = 'spotify';
	case VideoEvent = 'video';
	case AppleEvent = 'apple';
}

class EventEntry extends Model
{
	protected $casts = [
		'eventType' => EventType::class
	];
}

これで、データベースへのキャスティングとデータベースからのキャスティングがつながった:

php artisan tinker

\App\Model\EventEntry::first()->eventType->value;

そして文字列の値が戻ってくる。 eventTypeは実際には列挙型オブジェクトを返す。 value属性を追加する必要があるのはこのためです。

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

ルートバインディングの中で列挙クラスを使うこともできます。次のようなルートを制限したいとします:

Route::get('events/eventType');

このように、列挙クラスをバインドすることができる:

Route::get('/events/{eventType}', function (EventType $eventType) {
	return $eventType->value;
});

テスト範囲

Xdebugを日々の開発ツールチェーンで使うために戻ってきた。 というのは、ある種の啓示だった。長年 die()dd()デバッグしていた。PHPのSDKに取り掛かったとき、私たちのCIでは CodeCovを使用しており、テストスイート内で十分なカバレッジがないとPull Requestをマージできないようになっている。カバレッジはXdebugから提供されているので、まず.iniファイルでカバレッジを有効にする必要がある:

xdebug.mode=develop,debug,coverage

ここで artisan test --coverageを実行すると、アプリケーションのカバレッジを含むレポートが得られる:

Screenshot of the new test coverage output from Laravel's console

なかなかいいでしょ?

そして次は?

このバージョンは、Laravelの旅における新たなマイルストーンとなりますが、本当に驚くべきは、Laravelの周りに構築された拡張エコシステムです - Vapor、Breeze、Octane、Sail、Horizon...数え上げればきりがありません。Laravelプロジェクトのリストが増え続けていることで、私がエキサイティングだと思うのは、LaravelがPHP Foundationに参加したことです。 PHPファウンデーションに含まれていることです。 ニキータ・ポポフのPHPコア開発からの引退をきっかけに設立された.Symfonyと並んで、不朽の名言"PHPは死んだ"という不朽の名言は、真実から遠く離れたものではありません。

シェア:

https://a.storyblok.com/f/270183/400x385/12b3020c69/james-seconde.png
James SecondeシニアPHPデベロッパー

スタンダップ・コメディーの学位論文を持つ俳優の訓練を受け、ミートアップ・シーンを経てPHP開発に携わるようになった。技術について話したり書いたり、レコード・コレクションから変わったレコードを再生したり買ったりしています。