1749234647
2025-06-06 17:15:00
公開されています
Symfony 7.3は5月29日に新しいコンポーネントと、小さな玉ねぎのあるDXの多くの改善で着陸しました。私たちは回っていますか?
11月に予定されているSymfonyの次のメジャーバージョンである8.0を歓迎する前に、このイテレーション7.3は新製品の素晴らしいアンソロジーを提供します。このバージョンの主な変更を一緒に発見しましょう!
3つの新しいコンポーネント
オブジェクトを自動的にマップします
以前は、たとえば、あるオブジェクトからDTOからエンティティにあるオブジェクトから別のオブジェクトに転送され、手動で行われました。繰り返し、退屈なタスクであり、大きな価値のない多くのコードを生成します。
今日、ObjectMapper 私たちの生活を簡素化するためにありますか この転送を自動化することにより :
$product = $mapper->map($productDto, Product::class);
clafoutisのアイシング:コンポーネントは属性のおかげで高度に構成可能です #[Map] ソースクラスのプロパティに配置すること:
#[Map(target: Product::class)]
class ProductDto
{
#[Map(target: 'name')]
public string $productName;
}
それも可能ですパーソナライズされた条件または変換を追加します、あなたのニーズに応じて動作を改良する。
注:このコンポーネントはまだ実験的なステータスです。したがって、そのAPIは遅滞なくメジャーバージョンを進化させることができます。
Serializerの代替
コンポーネント JSonstreamer よりシンプルであるがより効率的な代替品を提供します JSONのオブジェクトをシリアル化します その逆も同様です。
#[JsonStreamable]
class Product
{
#[StreamedName('@id')]
public string $reference;
}
また、を提供します トランスシステム 値のフォーマットをカスタマイズします。
JSON形式でデータを探索します
名前付きの3つの新しいコンポーネントの最後 jsonpath、許可します JSON構造でより簡単にナビゲートします の標準化された構文に基づいています RFC 9535 :
$json = '{...}';
$crawler = new JsonCrawler($json);
$email = $crawler->find('$.user[0].email');
この統合された構文は提供されます かなり細かいフィルタリングと検索容量、複雑なJSONデータを探索するのに最適です!
そして、私のように、あなたはオブジェクトの構文を愛しているなら、それも可能です:
$json = '{...}';
$crawler = new JsonCrawler($json);
$path = new JsonPath();
$path = $path
->key('user')
->index(0)
->key('email')
;
$email = $crawler->find($path);
これまで以上にエレガントな構成
Symfonyは引き続き励まします LES属性PHPを介した構成、それを明るくするために、それを標準化し、関係するコードに近づけます。この新しいバージョンは、この方向にいくつかの改善をもたらします。
よりシンプルで読み取り可能なコマンド
コンソールコンポーネントには2つの新しい属性があります : #[Argument] et #[Option] 注ぐ コマンドの引数とオプションを簡単に定義および回復する メソッドを通過せずに configure()。さらに、属性 #[AsCommand] コマンドヘルプテキストを直接定義する新しいパラメーターがあります。
#[AsCommand(
name: 'app:export:product',
description: 'Exports product data by reference',
help: 'This command exports data for a given product reference',
)]
class ExportProductCommand
{
public function __invoke(
SymfonyStyle $io,
#[Argument] string $reference,
#[Option(description: 'Include all the prices by region')] bool $includePrices = false,
): int {
// ...
return Command::SUCCESS;
}
}
Twig拡張機能が進化します
Twig拡張機能も進化して宣言を簡素化します。 Symfony 7.3から、 AbstractExtension、メソッドを実装しません getFilters() または getFunctions()。
属性を使用するのに十分です #[AsTwigFilter] et #[AsTwigFunction] :
class PriceExtension
{
#[AsTwigFilter('product_reference')]
public function formatProductReference(string $reference): string
{
return sprintf('#%s', $reference);
}
#[AsTwigFunction('product_price')]
public function getProductPriceByRegion(Product $product, Region $region): string
{
return '...';
}
}
さらに良いことに、クラスを通過する必要があります Runtime パフォーマンスを最適化するには、 拡張機能はオンデマンドでロードされます。
私たちの道路のエイリアス
今では定義することが可能になりました 道路名のエイリアス。古い参照を壊すことなく、穏やかな命名戦略を開発したいときの非常に便利な斬新さ:
#[Route("https://studo.dev/", name: 'main_index', alias: ['index', 'main_home'])]
public function index(): Response
{
return new Response('Bienvenue');
}
定義することも可能です パラメーターの名前のエイリアス 道路の、これはオブジェクトのいくつかのプロパティが同じ名前を持っている場合に非常に実用的です。
#[Route('/blog/{categorySlug:category.slug}/{postSlug:post.slug}')]
シンプルだが効果的な改善
任意のユーザーからのアクセス許可を確認します
PHPメソッド isGranted() そしてその小枝に相当します is_granted() の SecurityBundle 現在ログインしているユーザーのアクセス許可を制御するための恐ろしく効果的なツールです。しかし、場合によっては、できることは有用です 任意の方法で選択されたユーザーの許可を確認してください。
この意味で、PHPメソッド isGrantedForUser() 追加された:
if ($this->security->isGrantedForUser($user, 'ROLE_ADMIN')) {
$user->setGodMode(true);
}
そしてもちろん、その小枝に相当します is_granted_for_user また利用可能です:
{% if is_granted_for_user(user, 'ROLE_PREMIUM_USER') %}
Send Gift
{% endif %}
有権者が表明されます
有権者は、メソッドを介した許可チェックの礎石です isGranted()。彼らの方法に感謝します voteOnAttribute()、彼らはリソースへのアクセスを許可またはアクセスしないためにブール値を紹介します。
許可システムの複雑さに応じて、デバッグ、トレーサビリティ、またはユーザーエクスペリエンスのニーズを拒否するために追加情報を提供する必要がある場合があります。
これまでのところ、そこに到達するためのメカニズムをいじくり回さなければなりませんでした。この新しい反復はパラメーターを追加します Vote メソッドの署名に voteOnAttribute() メッセージの拒否を豊かにするために:
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token, ?Vote $vote = null): bool
{
// ...
if (false === $subject->isLocked()) {
$vote?->addReason('The product is currently locked');
return false;
}
if ($user !== $subject->getSeller()) {
$vote?->addReason('Only the seller can update this product');
return false;
}
return true;
}
コンソールの外出の改善
コンポーネント Console レンダリングユーティリティの改善により豊かになり続けています。
テーブルヘルパー マークダウンレンダリングモードがあります:
$table = new Table($output);
$table
->setHeaders(['Name', 'E-mail', 'Enabled'])
->setRows([
['Paul', '[email protected]', 'yes'],
['Marc', '[email protected]', 'no'],
])
;
$table->setStyle('markdown');
$table->render();
新しいユーティリティ ツリーヘルパー 非常に単純なツリー構造を表示できます。
$tree = TreeHelper::createTree($io, null, [
'src' => [
'Controller' => [
'MainController.php',
],
'Entity',
'Kernel.php',
],
'templates' => [
'base.html.twig',
],
]);
$tree->render();
├── src
│ ├── Controller
│ │ └── MainController.php
│ ├── Entity
│ └── Kernel.php
└── templates
└── base.html.twig
サブベッドからのデータをマップします
属性 MapQueryString オブジェクトは、URLに存在するパラメーターからオブジェクトを自動的に水分補給します。 Symfony 7.3では、さらに実用的になります。私たちは今できます 特定のsubfをターゲットにします 設定で:
#[Route('/search')]
public function __invoke(#[MapQueryString('filters')] SearchFilters $filters): Response
{
// ...
}
メッセンジャーのメッセージを嘆きます
メッセンジャーは新しいミドルウェアを紹介します キュー内の同一のメッセージを嘆きます。同じメッセージの処理を数回回避し、リソースを節約したり、望ましくないエッジ効果を防ぐための実用的な機能。
$bus->dispatch(new UserReportMessage($user->getId()), [
new DeduplicateStamp(sprintf('user-report-%s', $user->getId())),
]);
そして、一度、私は数ヶ月前に家のシステムを錫メッキしたばかりだった…それは退屈だったので、私は率直に言って、もう一度始めなければならないことを嬉しく思います!
グローバル翻訳パラメーター
いくつかの翻訳パラメーターがアプリケーション全体で冗長である場合があります。各コール中に手動で送信すると、すぐに痛みがあります。私たちは今できます グローバル翻訳パラメーターを追加します 構成ファイル config/packages/translator.yaml :
translator:
# ...
globals:
'{app_name}': 'My Kitchen Feeder'
'{contact_email}': '[email protected]'
パフォーマンスは忘れられません
より良い回復力とパフォーマンスのための静的エラーのページ
Symfonyは今許可されていますHTML形式でエラーページをエクスポートします コマンドに感謝します error:dump。これにより、Webサーバーはアプリケーションを通過せずにこれらのページを直接提供し、あらゆる状況で迅速かつ信頼性の高いディスプレイを保証できます。
php bin/console error:dump public/error_pages
プロセッサを緩和するためのリソースの提案
コンポーネント AssetMapper 現在、機能をホストします 静的リソースの事前圧縮、たとえば、展開中に上流ファイルを圧縮して、CPU負荷を減らし、これらのリソースをより迅速に提供することができます。
この動作を有効にするには、次の構成をに追加するだけです config/packages/asset_mapper.yaml :
framework:
asset_mapper:
# ...
precompress:
format: 'gzip'
に加えて gzip、フォーマット brotli et zstandard サポートされています。
バージョン8の前に予測する減価償却
メソッドの減価償却 eraseCredentials()
メソッド eraseCredentials() インタフェース UserInterface 現在、減価償却されています。彼女は慣れていました 機密情報を削除します ユーザーオブジェクトに一時的に保存されます。 Symfonyはそれを自動的に呼んでいません。だから、モップから抜け出すと、クリーンアップするのはあなた次第です。
テーブルの形での制約オプションの通過はすぐに終了します
このバージョンから、 テーブルの形で検証制約のオプションを渡すことは減価償却されます。そして率直に言って、それは悪くありません。名前付きパラメーターを利用できるのに、なぜテーブルを悩ませるのですか?
// Deprecated syntax
new AssertLength([
'min' => 3,
'minMessage' => 'At least {{ limit }} characters',
]);
// Preferred syntax
new AssertChoice(
min: 3,
minMessage: 'At least {{ limit }} characters',
);
結論
いつものように、この新しいバージョンのSymfonyは、興味深い新機能のシェアをもたらします。この記事を簡潔に保つために、私に最も関連性が高いと思われる新しい機能を選択しました。ただし、Symfony 7.3にはさらに多くの提供があります。もっと知りたいなら、見つけることができます この記事のすべての改善 あなたはSymphonyをブログします。
お気に入りのPHPフレームワークの残りの開発については、Symfony 8.0とバージョン7.4 LTSの同時リリースをご覧ください。
このブログでお会いしましょう けいれん 👋
#Symfony #7.3は利用可能ですこのバージョンから何を覚えておいてください