Slide 1

Slide 1 text

Embracing the Future with Symfony 7 @nicolasgrekas

Slide 2

Slide 2 text

is a set of low-level building blocks that you can assemble to develop powerful high-level features easily

Slide 3

Slide 3 text

Auto-discovery Auto-configuration Auto-wiring #[Attributes]

Slide 4

Slide 4 text

symfony.com/releases

Slide 5

Slide 5 text

Backward Compatibility Promise • Upgrade every month for bug fixes • Upgrade every 6 months for features "require": { "php": ">=8.1" }

Slide 6

Slide 6 text

Continuous Upgrade Path • Fix deprecations every 6 months • Upgrade every 2 years for new major "require": { "php": ">=8.2" }

Slide 7

Slide 7 text

Symfony 7 • Remove deprecated code paths • Add native return types • Add native types to public|protected properties

Slide 8

Slide 8 text

New components #44681 Add the HtmlSanitizer component #46715 Add the Clock component #48542 Add the RemoteEvent and Webhook #47112 Add a Scheduler component #48371 Add AssetMapper to manage JS deps without nodejs

Slide 9

Slide 9 text

Notifier #47373 Add Chatwork bridge #46395 Add Contact Everyone bridge #46724 Add SMSFactor bridge #49454 Add Pushover bridge #49461 Add MailerSend bridge #48855 Add PagerDuty bridge #48101 Add Mastodon bridge #48466 Add Line bridge #48389 Add Bandwidth bridge #48394 Add Plivo bridge #48397 Add RingCentral bridge #48398 Add Termii bridge #48399 Add iSendPro bridge #48084 Add Twitter bridge

Slide 10

Slide 10 text

RIP Doctrine Annotations PHP 8 introduced attributes, which are a native replacement for annotations

Slide 11

Slide 11 text

RIP SensioFrameworkExtraBundle @Route @Entity @IsGranted @Security @ParamConverter @Cache @Template

Slide 12

Slide 12 text

Minors

Slide 13

Slide 13 text

Performance #48802 Cut compilation time #49781 Improve perf. of translation messages extraction #49676 Improve perf. of GlobResource

Slide 14

Slide 14 text

Types #49383 Add missing return types to interfaces #49022 Add missing template annotation on ServiceLocator #48750 Add generics to PasswordUpgraderInterface

Slide 15

Slide 15 text

+/** + * @template-covariant T of mixed + * @implements ServiceProviderInterface + */ class ServiceLocator implements ServiceProviderInterface, \Countable {

Slide 16

Slide 16 text

New syntax #48793 Leverage arrow function syntax for closure #48670 Use ::class #48069 Use ??= more

Slide 17

Slide 17 text

Features

Slide 18

Slide 18 text

Dependency Injection #[AsDecorator] #[AsTaggedItem] #[AutowireCallable] #[AutowireDecorated] #[AutowireLocator] #[AutowireServiceClosure] #[Exclude] #[Required] #[SubscribedService] #[Target] #[When]

Slide 19

Slide 19 text

Just Enjoy on your side #[AsEventListener] class MyRequestListener { public function __invoke(RequestEvent $event): void { // ... } }

Slide 20

Slide 20 text

#[AutoconfigureTag] interface ChannelInterface { } Define your rules

Slide 21

Slide 21 text

Enjoy your rules class ChannelBroadcaster { public function __construct( #[AutowireIterator(ChannelInterface::class)] iterable $channels ) { // ... }

Slide 22

Slide 22 text

#[AsAlias(ChannelInterface::class)] class DefaultChannel implements ChannelInterface {

Slide 23

Slide 23 text

#[Autoconfigure(lazy: true)] class PlotFactory { public function __construct( #[Autowire(param: 'kernel.debug')] private bool $debug, private HeavyDependency $heavyDependency, ) { } }

Slide 24

Slide 24 text

public function __construct( #[AutowireLocator([ 'router' => RouterInterface::class, 'slugger' => '?'.SluggerInterface::class, ])] ContainerInterface $container, )

Slide 25

Slide 25 text

public function __construct( #[AutowireCallable(UriTemplate::class, 'expand')] UriExpanderInterface $expander, )

Slide 26

Slide 26 text

HttpKernel #48352 #[WithHttpStatus] for defining status codes for exceptions #48747 #[WithLogLevel] for defining log levels for exceptions #[WithHttpStatus(429, ['Retry-After' => 10])] #[WithLogLevel(LogLevel::INFO)] class RateLimitedException extends \Exception {

Slide 27

Slide 27 text

Controllers #[CurrentUser] #[MapDateTime] #[MapEntity] #[MapQueryParameter] #[MapQueryString] #[MapRequestPayload] #[ValueResolver]

Slide 28

Slide 28 text

#[Route('/blog')] public function blog( #[MapQueryParameter] int $page = 1, )

Slide 29

Slide 29 text

#[Route('/product-review', methods: ['POST'])] public function post( #[MapRequestPayload] ProductReviewDto $productReview, )

Slide 30

Slide 30 text

class ProductReviewDto { public function __construct( #[Assert\NotBlank] #[Assert\Length(min: 10, max: 500)] public readonly string $comment, #[Assert\GreaterThanOrEqual(1)] #[Assert\LessThanOrEqual(5)] public readonly int $rating, ) { // ...

Slide 31

Slide 31 text

Validation #[NoSuspiciousCharacters] #[NotCompromisedPassword] #[PasswordStrength]

Slide 32

Slide 32 text

Credits

Slide 33

Slide 33 text

Hundreds of contributors

Slide 34

Slide 34 text

Backers for 6.4 & 7.0

Slide 35

Slide 35 text

symfony.com/slack Mutual aid Kindness CARE team

Slide 36

Slide 36 text

Thank you and see you soon!