- Added argument
$prefixtoAdapterInterface::clear() - Marked the
CacheDataCollectorclass as@final.
- Deprecated finding hidden commands using an abbreviation, use the full name instead
- Deprecated returning
nullfromCommand::execute(), return0instead - Deprecated the
Application::renderException()andApplication::doRenderException()methods, userenderThrowable()anddoRenderThrowable()instead.
- Deprecated the component in favor of the
ErrorHandlercomponent
- Deprecated overriding the
FilerLoader::import()method without declaring the optional$excludeargument
-
Made singly-implemented interfaces detection be scoped by file
-
Deprecated support for short factories and short configurators in Yaml
Before:
services: my_service: factory: factory_service:method
After:
services: my_service: factory: ['@factory_service', method]
-
Passing an instance of
Symfony\Component\DependencyInjection\Parameteras class name toSymfony\Component\DependencyInjection\Definitionis deprecated.Before:
new Definition(new Parameter('my_class'));
After:
new Definition('%my_class%');
- Deprecated injecting
ClassMetadataFactoryinDoctrineExtractor, an instance ofEntityManagerInterfaceshould be injected instead. - Deprecated passing an
IdReaderto theDoctrineChoiceLoaderwhen the query cannot be optimized with single id field. - Deprecated not passing an
IdReaderto theDoctrineChoiceLoaderwhen the query can be optimized with single id field. - Deprecated
RegistryInterface, useDoctrine\Common\Persistence\ManagerRegistry. - Added a new
getMetadataDriverClassmethod to replace class parameters inAbstractDoctrineExtension. This method will be abstract in Symfony 5 and must be declared in extending classes.
- Support for passing a
nullvalue toFilesystem::isAbsolutePath()is deprecated.
- Using different values for the "model_timezone" and "view_timezone" options of the
TimeTypewithout configuring a reference date is deprecated. - Using
intorfloatas data for theNumberTypewhen theinputoption is set tostringis deprecated. - Overriding the methods
FormIntegrationTestCase::setUp(),TypeTestCase::setUp()andTypeTestCase::tearDown()without thevoidreturn-type is deprecated.
- Deprecated calling
WebTestCase::createClient()while a kernel has been booted, ensure the kernel is shut down before calling the method - Deprecated support for
templatingengine inTemplateController, use Twig instead - The
$parserargument ofControllerResolver::__construct()andDelegatingLoader::__construct()has been deprecated. - The
ControllerResolverandDelegatingLoaderclasses have been marked asfinal. - The
controller_name_converterandresolve_controller_name_subscriberservices have been deprecated. - Deprecated
routing.loader.service, userouting.loader.containerinstead. - Not tagging service route loaders with
routing.route_loaderhas been deprecated. - Overriding the methods
KernelTestCase::tearDown()andWebTestCase::tearDown()without thevoidreturn-type is deprecated. - Marked the
RouterDataCollectorclass as@final.
- Added method
cancel()toResponseInterface
ApacheRequestis deprecated, useRequestclass instead.- Passing a third argument to
HeaderBag::get()is deprecated since Symfony 4.4, use methodall()instead - [BC BREAK]
PdoSessionHandlerwith MySQL changed the type of the lifetime column, make sure to runALTER TABLE sessions MODIFY sess_lifetime INTEGER UNSIGNED NOT NULLto update your database. PdoSessionHandlernow precalculates the expiry timestamp in the lifetime column, make sure to runCREATE INDEX EXPIRY ON sessions (sess_lifetime)to update your database to speed up garbage collection of expired sessions.
-
The
DebugHandlersListenerclass has been marked asfinal -
Added new Bundle directory convention consistent with standard skeletons:
└── MyBundle/ ├── config/ ├── public/ ├── src/ │ └── MyBundle.php ├── templates/ └── translations/To make this work properly, it is necessary to change the root path of the bundle:
class MyBundle extends Bundle { public function getPath(): string { return \dirname(__DIR__); } }
As many bundles must be compatible with a range of Symfony versions, the current directory convention is not deprecated yet, but it will be in the future.
-
Deprecated the second and third argument of
KernelInterface::locateResource -
Deprecated the second and third argument of
FileLocator::__construct -
Deprecated loading resources from
%kernel.root_dir%/Resourcesand%kernel.root_dir%as fallback directories. Resources like service definitions are usually loaded relative to the current directory or with a glob pattern. The fallback directories have never been advocated so you likely do not use those in any app based on the SF Standard or Flex edition. -
Getting the container from a non-booted kernel is deprecated
-
Marked the
AjaxDataCollector,ConfigDataCollector,EventDataCollector,ExceptionDataCollector,LoggerDataCollector,MemoryDataCollector,RequestDataCollectorandTimeDataCollectorclasses as@final. -
Marked the
RouterDataCollector::collect()method as@final. -
The
DataCollectorInterface::collect()andProfiler::collect()methods third parameter signature will be\Throwable $exception = nullinstead of\Exception $exception = nullin Symfony 5.0. -
Deprecated methods
ExceptionEvent::get/setException(), useget/setThrowable()instead -
Deprecated class
ExceptionListener, useErrorListenerinstead
- Deprecated
Symfony\Component\Lock\StoreInterfacein favor ofSymfony\Component\Lock\BlockingStoreInterfaceandSymfony\Component\Lock\PersistingStoreInterface. Factoryis deprecated, useLockFactoryinstead- Deprecated services
lock.store.flock,lock.store.semaphore,lock.store.memcached.abstractandlock.store.redis.abstract, useStoreFactory::createStoreinstead.
- [BC BREAK] Changed the DSN to use for disabling delivery (using the
NullTransport) fromsmtp://nulltonull://null(host doesn't matter). - [BC BREAK] Renamed class
SmtpEnvelopetoEnvelopeandDelayedSmtpEnvelopetoDelayedEnvelope. - [BC BREAK] Added a required
string $transportargument toMessageEvent::__construct.
- [BC BREAK] Removed
SendersLocatorInterface::getSenderByAliasadded in 4.3. - [BC BREAK] Removed
$retryStrategiesargument fromWorker::__construct. - [BC BREAK] Changed arguments of
ConsumeMessagesCommand::__construct. - [BC BREAK] Removed
$senderClassOrAliasargument fromRedeliveryStamp::__construct. - [BC BREAK] Removed
UnknownSenderException. - [BC BREAK] Removed
WorkerInterface. - [BC BREAK] Removed
$onHandledCallbackofWorker::run(array $options = [], callable $onHandledCallback = null). - [BC BREAK] Removed
StopWhenMemoryUsageIsExceededWorkerin favor ofStopWorkerOnMemoryLimitListener. - [BC BREAK] Removed
StopWhenMessageCountIsExceededWorkerin favor ofStopWorkerOnMessageLimitListener. - [BC BREAK] Removed
StopWhenTimeLimitIsReachedWorkerin favor ofStopWorkerOnTimeLimitListener. - [BC BREAK] Removed
StopWhenRestartSignalIsReceivedin favor ofStopWorkerOnRestartSignalListener. - Marked the
MessengerDataCollectorclass as@final.
- Removed
NamedAddress, useAddressinstead (which supports a name now)
- The
RouteProcessorhas been marked final.
- Deprecated the
Process::inheritEnvironmentVariables()method: env variables are always inherited.
- Deprecated passing
nullas 2nd argument ofPropertyAccessor::createCache()method ($defaultLifetime), pass0instead.
- Deprecated
ServiceRouterLoaderin favor ofContainerLoader. - Deprecated
ObjectRouteLoaderin favor ofObjectLoader.
-
The
LdapUserProviderclass has been deprecated, useSymfony\Component\Ldap\Security\LdapUserProviderinstead. -
Implementations of
PasswordEncoderInterfaceandUserPasswordEncoderInterfaceshould add a newneedsRehash()method -
Deprecated returning a non-boolean value when implementing
Guard\AuthenticatorInterface::checkCredentials(). Please explicitly returnfalseto indicate invalid credentials. -
The
ListenerInterfaceis deprecated, extendAbstractListenerinstead. -
Deprecated passing more than one attribute to
AccessDecisionManager::decide()andAuthorizationChecker::isGranted()(and indirectly theis_granted()Twig and ExpressionLanguage function)Before
if ($this->authorizationChecker->isGranted(['ROLE_USER', 'ROLE_ADMIN'])) { // ... }
After
if ($this->authorizationChecker->isGranted(new Expression("is_granted('ROLE_USER') or is_granted('ROLE_ADMIN')"))) {} // or: if ($this->authorizationChecker->isGranted('ROLE_USER') || $this->authorizationChecker->isGranted('ROLE_ADMIN') ) {}
- Marked the
SecurityDataCollectorclass as@final.
- Deprecated the
XmlEncoder::TYPE_CASE_ATTRIBUTESconstant. UseXmlEncoder::TYPE_CAST_ATTRIBUTESinstead.
- Deprecated passing
nullas 1st ($id) argument ofSection::get()method, pass a valid child section identifier instead.
- Deprecated support for using
nullas the locale inTranslator. - Deprecated accepting STDIN implicitly when using the
lint:xliffcommand, uselint:xliff -(append a dash) instead to make it explicit. - Marked the
TranslationDataCollectorclass as@final.
- Deprecated to pass
$rootDirand$fileLinkFormatteras 5th and 6th argument respectively to theDebugCommand::__construct()method, swap the variables position. - Deprecated accepting STDIN implicitly when using the
lint:twigcommand, uselint:twig -(append a dash) instead to make it explicit. - Marked the
TwigDataCollectorclass as@final.
-
Deprecated
twig.exception_controllerconfiguration option.If you were not using this option previously, set it to
null:After:
twig: exception_controller: null
If you were using this option previously, set it to
nulland useframework.error_controllerinstead:Before:
twig: exception_controller: 'App\Controller\MyExceptionController'
After:
twig: exception_controller: null framework: error_controller: 'App\Controller\MyExceptionController'
The new default exception controller will also change the error response content according to https://tools.ietf.org/html/rfc7807 for
json,xml,atomandtxtformats:Before:
{ "error": { "code": 404, "message": "Sorry, the page you are looking for could not be found" } }After:
{ "title": "Not Found", "status": 404, "detail": "Sorry, the page you are looking for could not be found" } -
Deprecated the
ExceptionControllerandPreviewErrorControllercontrollers, useErrorControllerfrom the HttpKernel component instead -
Deprecated all built-in error templates, use the error renderer mechanism of the
ErrorHandlercomponent -
Deprecated loading custom error templates in non-html formats. Custom HTML error pages based on Twig keep working as before:
Before (
templates/bundles/TwigBundle/Exception/error.json.twig):{ "type": "https://example.com/error", "title": "{{ status_text }}", "status": {{ status_code }} }After (
App\Serializer\ProblemJsonNormalizer):class ProblemJsonNormalizer implements NormalizerInterface { public function normalize($exception, $format = null, array $context = []) { return [ 'type' => 'https://example.com/error', 'title' => $exception->getStatusText(), 'status' => $exception->getStatusCode(), ]; } public function supportsNormalization($data, $format = null) { return 'json' === $format && $data instanceof FlattenException; } }
- [BC BREAK] Using null as
$classValidatorRegexpvalue inDoctrineLoader::__constructorPropertyInfoLoader::__constructwill not enable auto-mapping for all classes anymore, use'{.*}'instead. - Deprecated passing an
ExpressionLanguageinstance as the second argument ofExpressionValidator::__construct(). - Deprecated using anything else than a
stringas the code of aConstraintViolation, astringtype-hint will be added to the constructor of theConstraintViolationclass and to theConstraintViolationBuilder::setCode()method in 5.0. - Deprecated passing an
ExpressionLanguageinstance as the second argument ofExpressionValidator::__construct(). Pass it as the first argument instead. - The
Lengthconstraint expects theallowEmptyStringoption to be defined when theminoption is used. Set it totrueto keep the current behavior andfalseto reject empty strings. In 5.0, it'll become optional and will default tofalse. - Overriding the methods
ConstraintValidatorTestCase::setUp()andConstraintValidatorTestCase::tearDown()without thevoidreturn-type is deprecated. - deprecated
Symfony\Component\Validator\Mapping\Cache\CacheInterfaceand all implementations in favor of PSR-6. - deprecated
ValidatorBuilder::setMetadataCache, useValidatorBuilder::setMappingCacheinstead. - The
Rangeconstraint has a new message optionnotInRangeMessagethat is used when bothminandmaxvalues are set. In case you are using custom translations make sure to add one for this new message. - Marked the
ValidatorDataCollectorclass as@final.
- Deprecated the
ExceptionControllerclass in favor ofExceptionErrorController - Deprecated the
TemplateManager::templateExists()method
- The bundle is deprecated and will be removed in 5.0.
- Deprecated accepting STDIN implicitly when using the
lint:yamlcommand, uselint:yaml -(append a dash) instead to make it explicit.