Symfony Advent Calendar 2022 day1の記事です!
20202/11/30(日本時間だと2022/12/02になってから)にSymfony 6.2がリリースされました。 https://symfony.com/blog/symfony-6-2-0-released というわけで、Symfony6.2の新機能のうち注目すべきものをまとめました。
Template, Security, Cache, ParamConverterがSensioFrameworkExtraBundleからSymfonyコアに移動
基本的にuseするnamespaceを変えるだけで使い方は変わりませんが、ParamConverterだけ重要な変更が2点あるので注意です。
- ParamConverterは
MapEntity
に名前が変わります。 - DoctrineのEntityじゃないものをParamConverter的につっこむにはArgumentResolverの方を使うことになりました。
- いままで自前のParamConverterクラスを書くことでDoctrineのEntity以外のもの(Enumやデータクラスなど)をControllerのアクションに引数として渡すことができていました。今後はCustomのValueResolverを実装してください( Custom ValueResolverのドキュメント )
公式記事 https://symfony.com/blog/new-in-symfony-6-2-built-in-cache-security-template-and-doctrine-attributes
Clock Component
新しく Clock
コンポーネントが追加されました。 https://github.com/symfony/clock
- つい先日リリースされたばかりのPSR-20 Clock https://github.com/php-fig/clock と互換性のあるClockInterfaceと、ClockInterfaceの3つの具象が提供されます。
- カルテットでは長年phpmentors/domain-commonsのClock https://github.com/phpmentors-jp/domain-commons/blob/0e3b4057bf0b949a2fc5d36e1bc4195d7fa44dc2/src/DateTime/Clock.php を使っていましたが、今後移行していくつもりです。
公式記事 https://symfony.com/blog/new-in-symfony-6-2-clock-component
PSR-4 RouteLoaderによるパフォーマンス向上
config/routes.yamlでControllerのパスだけを指定していましたが、所定のディレクトリ以下にあるファイル全部に定義されたクラスを探しに行くようになっており、キャッシュのない初回アクセス時(またはコマンドによるキャッシュ生成時)にパフォーマンスが低下していました。
今回追加された Psr4DirectoryLoader
により、PSR-4を利用してクラスを効率的に探せるようになりました。開発者にとってはnamespaceも指定するだけの変更でパフォーマンス向上が期待できます。
公式記事 https://symfony.com/blog/new-in-symfony-6-2-psr-4-route-loader
FormのcreateView()が不要に
SymfonyFormをTwigに引き渡すとき、 $form
そのものでなく $form->createView()
を渡す必要がありましたが、 createView()
を呼ばずに $form
を渡しても良くなりました。Twigでレンダリングする前に内部的に createView()
が呼ばれるようになったとのことです。
公式記事 https://symfony.com/blog/new-in-symfony-6-2-dx-improvements#simpler-form-rendering
DependencyInjectionでEnumがもっと使いやすく
Enumをサービスのコンストラクタ引数として注入したいとき、 !php/enum
をつけてFQCNからEnumを指定することで注入できるようになりました。(いままでも !php/const
をつければ注入できていましたが、enumであることがより明示的になりました)
公式記事 https://symfony.com/blog/new-in-symfony-6-2-improved-enum-support
Fileバリデーションで拡張子ベースのファイルタイプバリデーションができるように
従来はファイルの種類に制約をかけたいとき、mimeTypeをで指定する必要がありました。画像やPDFぐらいなら良いのですが、csvとかエクセルファイルってmimeTypeなんだっけ…と私も毎回ググっていました。
Symfony6.2ではファイルの拡張子ベースで種類を指定できるようになりました。迷わず、ググらずに types: 'xlsx'
等と指定すればOKになりました。
公式記事 https://symfony.com/blog/new-in-symfony-6-2-improved-file-validator
条件付きバリデーション
項目Aがxxxなら項目Bはyyy以内、のような条件付きのバリデーションは、従来Callback制約を使って専用メソッドを実装するか、自前のConstraintとValidatorを作る必要がありました。
Symfony6.2では Symfony\Component\Validator\Constraints\When
アトリビュートが追加され、expression
で指定した条件によって制約をON/OFFできます。
公式記事 https://symfony.com/blog/new-in-symfony-6-2-conditional-constraints
紹介しきれなかった新機能がまだまだあります。 Symfony公式サイトのブログのliving-on-the-edgeカテゴリ に新機能の情報が集まっていますので、気になる方はそちらもチェックしてみてください。
Symfonyアドベントカレンダー2022、明日もカルテット開発部から @kin29ma_nさん の記事でお届けします!お楽しみに!