Что нового в Symfony 6.2: Встроенные атрибуты для Cache, Security, Template и Doctrine
Symfony 6.2 будет выпущен в конце ноября 2022. В этой серии статей мы рассмотрим новые возможности в Symfony 6.2.
Аннотации были добавлены в Symfony более 10 лет назад. Они были доступны при использовании дополнительного бандла SensioFrameworkExtraBundle.
С добавлением в PHP атрибутов, эти аннотации были переведены на нативные атрибуты. Но пакет sensio/framework-extra-bundle
все еще должен был быть установлен что бы использовать их. Например:
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Component\Routing\Annotation\Route;
#[Route('/comment/{postSlug}/new', methods: ['POST'], name: 'comment_new')]
#[IsGranted('IS_AUTHENTICATED_FULLY')]
#[ParamConverter('post', options: ['mapping' => ['postSlug' => 'slug']])]
public function addComment(Request $request, Post $post): Response
{
// ...
}
В Symfony 6.2, были добавлены #[Cache]
, #[Template]
, #[IsGranted]
и #[MapEntity]
в виде нативных атрибутов, и теперь для их использования больше не нужно устанавливать доп. пакеты в проект. #[IsGranted]
заменяет и улучшает аннотацию@Security()
и #[MapEntity]
заменяет@ParamConverter
.
В большинстве приложений вам потребуется изменить только namespace без изменения вашего кода:
-use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
+use Symfony\Component\Security\Http\Attribute\IsGranted;
-use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
+use Symfony\Component\HttpKernel\Attribute\Cache;
Атрибут #[MapEntity]
(доступен в DoctrineBundle >= 2.7.1) работает точно так же как #[ParamConverter]
: в большинстве случаев вам не нужно использовать это атрибут явно, он работает автоматически.
Однако, если вы ранее использовали #[ParamConverter]
с конфигурацией, вам необходимо сделать несколько изменений для использования нового атрибута #[MapEntity]
. Так же новый атрибут применяется к свойствам а не всему методу целиком:
-use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
+use Symfony\Bridge\Doctrine\Attribute\MapEntity;
// ...
-#[ParamConverter('post', options: ['mapping' => ['postSlug' => 'slug']])]
-public function addComment(Request $request, Post $post): Response
+public function addComment(
+ Request $request,
+ #[MapEntity(mapping: ['postSlug' => 'slug'])] Post $post
+): Response
{
// ...
}
Атрибуты в PHP это отличный способ для управления конфигурацией через код. Однако если вы не хотите их использовать вы по прежнему можете описывать конфигурацию через XML/YAML или напрямую в PHP коде.