- The
Client::submit()
method will have a new$serverParameters
argument in version 5.0, not defining it is deprecated.
- Deprecated
CacheItem::getPreviousTags()
, useCacheItem::getMetadata()
instead.
-
Deprecated constructing a
TreeBuilder
without passing root node information:Before:
$treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('my_config');
After:
$treeBuilder = new TreeBuilder('my_config'); $rootNode = $treeBuilder->getRootNode();
-
Deprecated
FileLoaderLoadException
, useLoaderLoadException
instead.
-
Deprecated passing a command as a string to
ProcessHelper::run()
, pass the command as an array of arguments instead.Before:
$processHelper->run($output, 'ls -l');
After:
$processHelper->run($output, array('ls', '-l')); // alternatively, when a shell wrapper is required $processHelper->run($output, Process::fromShellCommandline('ls -l'));
- The
lazy
attribute ondoctrine.event_listener
tags was removed. Listeners are now lazy by default. So anylazy
attributes can safely be removed from those tags.
- The
Crawler::children()
method will have a new$selector
argument in version 5.0, not defining it is deprecated.
- The
Finder::sortByName()
method will have a new$useNaturalSort
argument in version 5.0, not defining it is deprecated.
-
The
symfony/translation
dependency has been removed - runcomposer require symfony/translation
if you need the component -
The
getExtendedType()
method of theFormTypeExtensionInterface
is deprecated and will be removed in 5.0. Type extensions must implement the staticgetExtendedTypes()
method instead and return an iterable of extended types.Before:
class FooTypeExtension extends AbstractTypeExtension { public function getExtendedType() { return FormType::class; } // ... }
After:
class FooTypeExtension extends AbstractTypeExtension { public static function getExtendedTypes(): iterable { return array(FormType::class); } // ... }
-
The
scale
option of theIntegerType
is deprecated. -
The
$scale
argument of theIntegerToLocalizedStringTransformer
is deprecated. -
Deprecated calling
FormRenderer::searchAndRenderBlock
for fields which were already rendered. Instead of expecting such calls to return empty strings, check if the field has already been rendered.Before:
{% for field in fieldsWithPotentialDuplicates %} {{ form_widget(field) }} {% endfor %}
After:
{% for field in fieldsWithPotentialDuplicates if not field.rendered %} {{ form_widget(field) }} {% endfor %}
-
The
regions
option of theTimezoneType
is deprecated.
-
The following middleware service ids were renamed:
messenger.middleware.call_message_handler
becomesmessenger.middleware.handle_message
messenger.middleware.route_messages
becomesmessenger.middleware.send_message
If you set
framework.messenger.buses.[bus_id].default_middleware
tofalse
, replace any of these names in theframework.messenger.buses.[bus_id].middleware
list. -
The
allow_no_handler
middleware has been removed. Useframework.messenger.buses.[bus_id].default_middleware
instead:Before:
framework: messenger: buses: messenger.bus.events: middleware: - allow_no_handler
After:
framework: messenger: buses: messenger.bus.events: default_middleware: allow_no_handlers
-
The
messenger:consume-messages
command expects a mandatory--bus
option value if you have more than one bus configured. -
The
framework.router.utf8
configuration option has been added. If your app's charset is UTF-8 (see kernel'sgetCharset()
method), it is recommended to set it totrue
: this will generate 404s for non-UTF-8 URLs, which are incompatible with you app anyway, and will allow dumping optimized routers and using Unicode classes in requirements. -
Added support for the SameSite attribute for session cookies. It is highly recommended to set this setting (
framework.session.cookie_samesite
) tolax
for increased security against CSRF attacks. -
The
Controller
class has been deprecated, useAbstractController
instead. -
The Messenger encoder/decoder configuration has been changed for a unified Messenger serializer configuration.
Before:
framework: messenger: encoder: your_encoder_service_id decoder: your_decoder_service_id
After:
framework: messenger: serializer: id: your_messenger_service_id
-
The
ContainerAwareCommand
class has been deprecated, useSymfony\Component\Console\Command\Command
with dependency injection instead. -
The
Templating\Helper\TranslatorHelper::transChoice()
method has been deprecated, use thetrans()
one instead with a%count%
parameter. -
Deprecated support for legacy translations directories
src/Resources/translations/
andsrc/Resources/<BundleName>/translations/
, usetranslations/
instead. -
Support for the legacy directory structure in
translation:update
anddebug:translation
commands has been deprecated.
- The default value of the
$secure
and$samesite
arguments of Cookie's constructor will respectively change fromfalse
tonull
and fromnull
tolax
in Symfony 5.0, you should define their values explicitly or useCookie::create()
instead.
- The
Kernel::getRootDir()
and thekernel.root_dir
parameter have been deprecated - The
KernelInterface::getName()
and thekernel.name
parameter have been deprecated - Deprecated the first and second constructor argument of
ConfigDataCollector
- Deprecated
ConfigDataCollector::getApplicationName()
- Deprecated
ConfigDataCollector::getApplicationVersion()
-
The
MiddlewareInterface::handle()
andSenderInterface::send()
methods must now return anEnvelope
instance. -
The return value of handlers isn't forwarded anymore by middleware and buses. If you used to return a value, e.g in query bus handlers, you can either:
- get the result from the
HandledStamp
in the envelope returned by the bus. - use the
HandleTrait
to leverage a message bus, expecting a single, synchronous message handling and returning its result. - make your
Query
mutable to allow setting & getting a result:// When dispatching: $bus->dispatch($query = new Query()); $result = $query->getResult(); // In your handler: $query->setResult($yourResult);
- get the result from the
-
The
EnvelopeAwareInterface
was removed and theMiddlewareInterface::handle()
method now requires anEnvelope
object as first argument. When using built-in middleware with the providedMessageBus
, you will not have to do anything.
If you use your ownMessageBusInterface
implementation, you must wrap the message in anEnvelope
before passing it to middleware.
If you created your own middleware, you must change the signature to always expect anEnvelope
. -
The
MiddlewareInterface::handle()
second argument (callable $next
) has changed in favor of aStackInterface
instance. When using built-in middleware with the providedMessageBus
, you will not have to do anything.
If you use your ownMessageBusInterface
implementation, you can use theStackMiddleware
implementation.
If you created your own middleware, you must change the signature to always expect anStackInterface
instance and call$stack->next()->handle($envelope, $stack)
instead of$next
to call the next middleware:Before:
public function handle($message, callable $next): Envelope { // do something before $message = $next($message); // do something after return $message; }
After:
public function handle(Envelope $envelope, StackInterface $stack): Envelope { // do something before $envelope = $stack->next()->handle($envelope, $stack); // do something after return $envelope; }
-
StampInterface
replacesEnvelopeItemInterface
and doesn't extendSerializable
anymore. Built-inReceivedMessage
,ValidationConfiguration
andSerializerConfiguration
were renamed respectivelyReceivedStamp
,ValidationStamp
,SerializerStamp
and moved to theStamp
namespace. -
AllowNoHandlerMiddleware
has been removed in favor of a new constructor argument onHandleMessageMiddleware
-
The
ConsumeMessagesCommand
class now takes an instance ofPsr\Container\ContainerInterface
as first constructor argument, i.e a message bus locator. The CLI command now expects a mandatory--bus
option value if there is more than one bus in the locator. -
MessageSubscriberInterface::getHandledMessages()
return value has changed. The value of an array item needs to be an associative array or the method name.Before:
return [ [FirstMessage::class, 0], [SecondMessage::class, -10], ];
After:
yield FirstMessage::class => ['priority' => 0]; yield SecondMessage::class => ['priority' => -10];
Before:
return [ SecondMessage::class => ['secondMessageMethod', 20], ];
After:
yield SecondMessage::class => [ 'method' => 'secondMessageMethod', 'priority' => 20, ];
-
The
EncoderInterface
andDecoderInterface
interfaces have been replaced by a unifiedSymfony\Component\Messenger\Transport\Serialization\SerializerInterface
. Each interface method have been merged untouched into theSerializer
interface, so you can simply merge your two implementations together and implement the new interface. -
The
HandlerLocator
class was replaced withSymfony\Component\Messenger\Handler\HandlersLocator
.Before:
new HandlerLocator([ YourMessage::class => $handlerCallable, ]);
After:
new HandlersLocator([ YourMessage::class => [ $handlerCallable, ] ]);
- The methods
DebugProcessor::getLogs()
,DebugProcessor::countErrors()
,Logger::getLogs()
andLogger::countErrors()
will have a new$request
argument in version 5.0, not defining it is deprecated.
-
Deprecated the
Process::setCommandline()
and thePhpProcess::setPhpBinary()
methods. -
Deprecated passing commands as strings when creating a
Process
instance.Before:
$process = new Process('ls -l');
After:
$process = new Process(array('ls', '-l')); // alternatively, when a shell wrapper is required $process = Process::fromShellCommandline('ls -l');
- Using the
has_role()
function in security expressions is deprecated, use theis_granted()
function instead. - Not returning an array of 3 elements from
FirewallMapInterface::getListeners()
is deprecated, the 3rd element must be an instance ofLogoutListener
ornull
. - Passing custom class names to the
Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolver
to define custom anonymous and remember me token classes is deprecated. To use custom tokens, extend the existingSymfony\Component\Security\Core\Authentication\Token\AnonymousToken
orSymfony\Component\Security\Core\Authentication\Token\RememberMeToken
. - Accessing the user object that is not an instance of
UserInterface
fromSecurity::getUser()
is deprecated. SimpleAuthenticatorInterface
,SimpleFormAuthenticatorInterface
,SimplePreAuthenticatorInterface
,SimpleAuthenticationProvider
,SimpleAuthenticationHandler
,SimpleFormAuthenticationListener
andSimplePreAuthenticationListener
have been deprecated. Use Guard instead.
- Passing a
FirewallConfig
instance as 3rd argument to theFirewallContext
constructor is deprecated, pass aLogoutListener
instance instead. - Using the
security.authentication.trust_resolver.anonymous_class
andsecurity.authentication.trust_resolver.rememberme_class
parameters to define the token classes is deprecated. To use custom tokens extend the existing AnonymousToken and RememberMeToken. - The
simple_form
andsimple_preauth
authentication listeners have been deprecated, use Guard instead. - The
SimpleFormFactory
andSimplePreAuthenticationFactory
classes have been deprecated, use Guard instead.
- Relying on the default value (false) of the "as_collection" option is deprecated. You should set it to false explicitly instead as true will be the default value in 5.0.
- The
AbstractNormalizer::handleCircularReference()
method will have two new$format
and$context
arguments in version 5.0, not defining them is deprecated.
- The
TranslatorInterface
has been deprecated in favor ofSymfony\Contracts\Translation\TranslatorInterface
- The
Translator::transChoice()
method has been deprecated in favor of usingTranslator::trans()
with "%count%" as the parameter driving plurals - The
MessageSelector
,Interval
andPluralizationRules
classes have been deprecated, useIdentityTranslator
instead - The
Translator::getFallbackLocales()
andTranslationDataCollector::getFallbackLocales()
method have been marked as internal
- The
transchoice
tag and filter have been deprecated, use thetrans
ones instead with a%count%
parameter. - Deprecated support for legacy templates directories
src/Resources/views/
andsrc/Resources/<BundleName>/views/
, usetemplates/
andtemplates/bundles/<BundleName>/
instead.
- The
symfony/translation
dependency has been removed - runcomposer require symfony/translation
if you need the component - The
checkMX
andcheckHost
options of theEmail
constraint are deprecated - The component is now decoupled from
symfony/translation
and usesSymfony\Contracts\Translation\TranslatorInterface
instead - The
ValidatorBuilderInterface
has been deprecated andValidatorBuilder::setTranslator()
has been made final - Deprecated validating instances of
\DateTimeInterface
inDateTimeValidator
,DateValidator
andTimeValidator
. UseType
instead or remove the constraint if the underlying model is type hinted to\DateTimeInterface
already. - Using the
Bic
,Country
,Currency
,Language
andLocale
constraints withoutsymfony/intl
is deprecated - Using the
Email
constraint in strict mode withoutegulias/email-validator
is deprecated - Using the
Expression
constraint withoutsymfony/expression-language
is deprecated