New in Symfony 6.2: Built-in Cache, Security, Template and Doctrine Attributes
October 28, 2022 • Published by Javier Eguiluz
Symfony 6.2 is backed by:
Warning: This post is about an unsupported Symfony version. Some of this information may be out of date. Read the most recent Symfony Docs.
Symfony 6.2 will be released at the end of November 2022. This is the first article of the series that shows the most important new features introduced by Symfony 6.2.
Contributed by
Nicolas Grekas
and Jérémy Derussé
in #43854,
#46880,
#46906,
and #46907.
Symfony introduced annotations to configure cache, security, templates and Doctrine more than 10 years ago. They were available via an external bundle called SensioFrameworkExtraBundle.
With the introduction of PHP attributes, we turned those annotations into
attributes. However, you still had to install sensio/framework-extra-bundle
package to use them. For example:
1 2 3 4 5 6 7 8 9 10 11
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
{
// ...
}
In Symfony 6.2, we've introduced #[Cache]
, #[Template]
, #[IsGranted]
and #[MapEntity]
as native attributes, so you no longer need to install
any external package to use them. #[IsGranted]
replaces and improves the
previous @Security()
annotation and #[MapEntity]
replaces the previous
@ParamConverter
annotation.
In most applications, you will only need to update the imported namespace, without having to change anything in your code:
1 2 3 4
-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;
The #[MapEntity]
feature (available when using DoctrineBundle >= 2.7.1) works
just like #[ParamConverter]
: in most situations you don't need to use the
attribute at all, it's automatic.
However, if you previously used #[ParamConverter]
to customize your configuration,
you'll need to make some changes to turn it into the new #[MapEntity]
attribute.
Also, the new attribute is applied to properties, instead of to the entire method:
1 2 3 4 5 6 7 8 9 10 11 12 13
-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
{
// ...
}
We believe that PHP attributes are a great way to add metadata configuration to code. However, if you don't like them, you can skip them and keep configuring things in XML/YAML or directly in PHP code.
Help the Symfony project!
As with any Open-Source project, contributing code or documentation is the most common way to help, but we also have a wide range of sponsoring opportunities.
Comments are closed.
To ensure that comments stay relevant, they are closed for old posts.
"In Symfony 6.2, we've introduced #[IsGranted], #[Cache], #[Template] and #[ParamConverter] as native attributes, so you no longer need to install any external package to use them."
I think you guys meant
In Symfony 6.2, we've introduced #[IsGranted], #[Cache], #[Template] and #[MapEntity] as native attributes, so you no longer need to install any external package to use them.
Either MapEntity is a replacement for ParamConverter as explained in the code below or was not mentioned. But something feels wrong.
Either way, this is so cool I always felt SensioFrameworkExtraBundle was that piece of code that felt forced and everything inside it should be part of other bundles or SF it self.
great addition
The behavior of the new `MapEntity` is identical to the old `ParamConverter`, the attribute is optional, and when the behavior is enabled in your config, then all your entities will be automatically resolved. But you can fine-tune specific properties (like custom RouteParameter name, or Repository method) with the attribute.
It's even better that the `ParamConverter` because, when activated globally in your config, you can also disable the behavior for one controller or two with the attribute (which is not possible with `SensioFrameworkExtraBundle`)
Are there plans to convert `Sensio\Bundle\FrameworkExtraBundle\Configuration\Security` to Symfony core too?
#[Entity('document', expr: 'repository.find(did)')]
also do without the sensio-bundle and if so how?
However, the new IsGranted attribute of Symfony is much more powerful than the IsGranted annotation of SensioFrameworkExtraBundle and it should allow migrating to it.
One more step towards the end of the SensioFrameworkExtraBundle which was efficient but a bit of a catch-all :)
ParamConverter is/was more than just a way to map an entity though.
It would be nice to mention that for those using custom ParamConverter classes (implementing ParamConverterInterface) without DoctrineBundle, the solution is to migrate them to Argument Resolver classes (implementing ArgumentValueResolverInterface).
https://symfony.com/doc/6.2/controller/value_resolver.html#adding-a-custom-value-resolver
Note that ArgumentValueResolverInterface work directly on the argument injected into the controller. ParamConverter modified the request attributes, which had an impact outside of the controller.