The first step to upgrade a Symfony 3.x application to 4.x is to update the file and directory structure of your application:
| Symfony 3.x | Symfony 4.x |
|---|---|
app/config/ |
config/ |
app/config/*.yml |
config/*.yaml and config/packages/*.yaml |
app/config/parameters.yml.dist |
config/services.yaml and .env.dist |
app/config/parameters.yml |
config/services.yaml and .env |
app/Resources/<BundleName>/views/ |
templates/bundles/<BundleName>/ |
app/Resources/ |
src/Resources/ |
app/Resources/assets/ |
assets/ |
app/Resources/translations/ |
translations/ |
app/Resources/views/ |
templates/ |
src/AppBundle/ |
src/ |
var/logs/ |
var/log/ |
web/ |
public/ |
web/app.php |
public/index.php |
web/app_dev.php |
public/index.php |
Then, upgrade the contents of your console script and your front controller:
bin/console: https://github.com/symfony/recipes/blob/master/symfony/console/3.3/bin/consolepublic/index.php: https://github.com/symfony/recipes/blob/master/symfony/framework-bundle/3.3/public/index.php
Lastly, read the following article to add Symfony Flex to your application and upgrade the configuration files: https://symfony.com/doc/current/setup/flex.html
If you use Symfony components instead of the whole framework, you can find below the upgrading instructions for each individual bundle and component.
- The component has been removed. Use Composer instead.
- The protected
TreeBuilder::$builderproperty has been removed.
-
Setting unknown style options is not supported anymore and throws an exception.
-
The
QuestionHelper::setInputStream()method is removed. UseStreamableInputInterface::setStream()orCommandTester::setInputs()instead.Before:
$input = new ArrayInput(); $questionHelper->setInputStream($stream); $questionHelper->ask($input, $output, $question);
After:
$input = new ArrayInput(); $input->setStream($stream); $questionHelper->ask($input, $output, $question);
Before:
$commandTester = new CommandTester($command); $stream = fopen('php://memory', 'r+', false); fputs($stream, "AppBundle\nYes"); rewind($stream); $command->getHelper('question')->setInputStream($stream); $commandTester->execute();
After:
$commandTester = new CommandTester($command); $commandTester->setInputs(['AppBundle', 'Yes']); $commandTester->execute();
-
The
console.exceptionevent and the relatedConsoleExceptionEventclass have been removed in favor of theconsole.errorevent and theConsoleErrorEventclass. -
The
SymfonyQuestionHelper::askdefault validation has been removed in favor ofQuestion::setValidator.
-
The
ContextErrorExceptionclass has been removed. Use\ErrorExceptioninstead. -
FlattenException::getTrace()now returns additional type descriptionsintegerandfloat. -
Support for stacked errors in the
ErrorHandlerhas been removed
-
Definitions and aliases are now private by default in 4.0. You should either use service injection or explicitly define your services as public if you really need to inject the container.
-
Relying on service auto-registration while autowiring is not supported anymore. Explicitly inject your dependencies or create services whose ids are their fully-qualified class name.
Before:
namespace App\Controller; use App\Mailer; class DefaultController { public function __construct(Mailer $mailer) { // ... } // ... }
services: App\Controller\DefaultController: autowire: true
After:
// same PHP codeservices: App\Controller\DefaultController: autowire: true # or # App\Controller\DefaultController: # arguments: { $mailer: "@App\Mailer" } App\Mailer: autowire: true
-
Autowiring services based on the types they implement is not supported anymore. It will only look for an alias or a service id that matches a given FQCN. Rename (or alias) your services to their FQCN id to make them autowirable. In 3.4, you can activate this behavior instead of having deprecation messages by setting the following parameter:
parameters: container.autowiring.strict_mode: true
From 4.0, you can remove it as it's the default behavior and the parameter is not handled anymore.
-
_defaultsand_instanceofare now reserved service names in Yaml configurations. Please rename any services with that names. -
Non-numeric keys in methods and constructors arguments have never been supported and are now forbidden. Please remove them if you happen to have one.
-
Service names that start with an underscore are now reserved in Yaml files. Please rename any services with such names.
-
Autowiring-types have been removed, use aliases instead.
Before:
<service id="annotations.reader" class="Doctrine\Common\Annotations\AnnotationReader" public="false"> <autowiring-type>Doctrine\Common\Annotations\Reader</autowiring-type> </service>
After:
<service id="annotations.reader" class="Doctrine\Common\Annotations\AnnotationReader" public="false" /> <service id="Doctrine\Common\Annotations\Reader" alias="annotations.reader" public="false" />
-
Service identifiers and parameter names are now case sensitive.
-
The
ReferenceandAliasclasses do not make service identifiers lowercase anymore. -
Using the
PhpDumperwith an uncompiledContainerBuilderis not supported anymore. -
Extending the containers generated by
PhpDumperis not supported anymore. -
The
DefinitionDecoratorclass has been removed. Use theChildDefinitionclass instead. -
The
ResolveDefinitionTemplatesPassclass has been removed. Use theResolveChildDefinitionsPassclass instead. -
Using unsupported configuration keys in YAML configuration files raises an exception.
-
Using unsupported options to configure service aliases raises an exception.
-
Setting or unsetting a service with the
Container::set()method is no longer supported. Only synthetic services can be set or unset. -
Checking the existence of a private service with the
Container::has()method is no longer supported and will returnfalse. -
Requesting a private service with the
Container::get()method is no longer supported. -
The
strictattribute in service arguments has been removed. The attribute is ignored since 3.0, you can remove it. -
Top-level anonymous services in XML are no longer supported.
-
The
ExtensionCompilerPasshas been moved to before-optimization passes with priority -1000. -
In 3.4, parameter
container.dumper.inline_class_loaderwas introduced. Unless you're using a custom autoloader, you should enable this parameter. This can drastically improve DX by reducing the time to load classes when theDebugClassLoaderis enabled. If you're usingFrameworkBundle, this performance improvement will also impact the "dev" environment:parameters: container.dumper.inline_class_loader: true
- The
Symfony\Bridge\Doctrine\HttpFoundation\DbalSessionHandlerandSymfony\Bridge\Doctrine\HttpFoundation\DbalSessionHandlerSchemahave been removed. UseSymfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandlerinstead.
-
The
ContainerAwareEventDispatcherclass has been removed. UseEventDispatcherwith closure factories instead. -
The
reset()method has been added toTraceableEventDispatcherInterface.
- The ability to pass a
ParserCacheInterfaceinstance to theExpressionLanguageclass has been removed. You should use theCacheItemPoolInterfaceinterface instead.
- The
Symfony\Component\Filesystem\LockHandlerhas been removed, use theSymfony\Component\Lock\Store\FlockStoreclass or theSymfony\Component\Lock\Store\FlockStore\SemaphoreStoreclass directly instead. - Support for passing relative paths to
Filesystem::makePathRelative()has been removed.
- The
ExceptionInterfacehas been removed. - The
Symfony\Component\Finder\Iterator\FilterIteratorclass has been removed as it used to fix a bug which existed before version 5.5.23/5.6.7
-
The values of the
FormEvents::*constants have been updated to match the constant names. You should only update your application if you relied on the constant values instead of their names. -
The
choices_as_valuesoption of theChoiceTypehas been removed. -
Support for data objects that implements both
TraversableandArrayAccessinResizeFormListener::preSubmitmethod has been removed. -
Using callable strings as choice options in ChoiceType is not supported anymore in favor of passing PropertyPath instances.
Before:
'choice_value' => new PropertyPath('range'), 'choice_label' => 'strtoupper',
After:
'choice_value' => 'range', 'choice_label' => function ($choice) { return strtoupper($choice); },
-
Caching of the loaded
ChoiceListInterfacein theLazyChoiceListhas been removed, it must be cached in theChoiceLoaderInterfaceimplementation instead. -
Calling
isValid()on aForminstance before submitting it is not supported anymore and raises an exception.Before:
if ($form->isValid()) { // ... }
After:
if ($form->isSubmitted() && $form->isValid()) { // ... }
-
Using the "choices" option in
CountryType,CurrencyType,LanguageType,LocaleType, andTimezoneTypewithout overriding thechoice_loaderoption is now ignored.Before:
$builder->add('custom_locales', LocaleType::class, [ 'choices' => $availableLocales, ]);
After:
$builder->add('custom_locales', LocaleType::class, [ 'choices' => $availableLocales, 'choice_loader' => null, ]); // or $builder->add('custom_locales', LocaleType::class, [ 'choice_loader' => new CallbackChoiceLoader(function () { return $this->getAvailableLocales(); }), ]);
-
Removed
ChoiceLoaderInterfaceimplementation inTimezoneType. Use the "choice_loader" option instead.Before:
class MyTimezoneType extends TimezoneType { public function loadChoiceList() { // override the method } }
After:
class MyTimezoneType extends AbstractType { public function getParent() { return TimezoneType::class; } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefault('choice_loader', ...); // override the option instead } }
-
FormRendererInterface::setThemeandFormRendererEngineInterface::setThemehave a new optional argument$useDefaultThemeswith a default value set totrue.
-
The
session.use_strict_modeoption has been removed and strict mode is always enabled. -
The
validator.mapping.cache.doctrine.apcservice has been removed. -
The "framework.trusted_proxies" configuration option and the corresponding "kernel.trusted_proxies" parameter have been removed. Use the
Request::setTrustedProxies()method in your front controller instead. -
The default value of the
framework.workflows.[name].typeconfiguration options is nowstate_machine. -
Support for absolute template paths has been removed.
-
The following form types registered as services have been removed; use their fully-qualified class name instead:
"form.type.birthday""form.type.checkbox""form.type.collection""form.type.country""form.type.currency""form.type.date""form.type.datetime""form.type.email""form.type.file""form.type.hidden""form.type.integer""form.type.language""form.type.locale""form.type.money""form.type.number""form.type.password""form.type.percent""form.type.radio""form.type.range""form.type.repeated""form.type.search""form.type.textarea""form.type.text""form.type.time""form.type.timezone""form.type.url""form.type.button""form.type.submit""form.type.reset"
-
The
framework.serializer.cacheoption and the servicesserializer.mapping.cache.apcandserializer.mapping.cache.doctrine.apchave been removed. APCu should now be automatically used when available. -
The
Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\CompilerDebugDumpPasshas been removed. -
The
Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddConsoleCommandPasshas been removed. UseSymfony\Component\Console\DependencyInjection\AddConsoleCommandPassinstead. -
The
Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\SerializerPassclass has been removed. Use theSymfony\Component\Serializer\DependencyInjection\SerializerPassclass instead. -
The
Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\FormPassclass has been removed. Use theSymfony\Component\Form\DependencyInjection\FormPassclass instead. -
The
Symfony\Bundle\FrameworkBundle\EventListener\SessionListenerclass has been removed. Use theSymfony\Component\HttpKernel\EventListener\SessionListenerclass instead. -
The
Symfony\Bundle\FrameworkBundle\EventListener\TestSessionListenerclass has been removed. Use theSymfony\Component\HttpKernel\EventListener\TestSessionListenerclass instead. -
The
Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\ConfigCachePassclass has been removed. Use tagged iterator arguments instead. -
The
Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\PropertyInfoPassclass has been removed. Use theSymfony\Component\PropertyInfo\DependencyInjection\PropertyInfoPassclass instead. -
Class parameters related to routing have been removed
- router.options.generator_class
- router.options.generator_base_class
- router.options.generator_dumper_class
- router.options.matcher_class
- router.options.matcher_base_class
- router.options.matcher_dumper_class
- router.options.matcher.cache_class
- router.options.generator.cache_class
-
The
Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\ControllerArgumentValueResolverPassclass has been removed. Use theSymfony\Component\HttpKernel\DependencyInjection\ControllerArgumentValueResolverPassclass instead. -
The
Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\RoutingResolverPassclass has been removed. Use theSymfony\Component\Routing\DependencyInjection\RoutingResolverPassclass instead. -
The
Symfony\Bundle\FrameworkBundle\Translation\Translatorconstructor now takes the default locale as mandatory 3rd argument. -
The
Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddValidatorInitializersPassclass has been removed. Use theSymfony\Component\Validator\DependencyInjection\AddValidatorInitializersPassclass instead. -
The
Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddConstraintValidatorsPassclass has been removed. Use theSymfony\Component\Validator\DependencyInjection\AddConstraintValidatorsPassclass instead. -
The
Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\ValidateWorkflowsPassclass has been removed. Use theSymfony\Component\Workflow\DependencyInjection\ValidateWorkflowsPassclass instead. -
Using the
KERNEL_DIRenvironment variable and the automatic guessing based on thephpunit.xmlfile location have been removed from theKernelTestCase::getKernelClass()method implementation. Set theKERNEL_CLASSenvironment variable to the fully-qualified class name of your Kernel or override theKernelTestCase::createKernel()orKernelTestCase::getKernelClass()method instead. -
The methods
KernelTestCase::getPhpUnitXmlDir()andKernelTestCase::getPhpUnitCliConfigArgument()have been removed. -
The
Symfony\Bundle\FrameworkBundle\Validator\ConstraintValidatorFactoryclass has been removed. UseSymfony\Component\Validator\ContainerConstraintValidatorFactoryinstead. -
The
--no-prefixoption of thetranslation:updatecommand has been removed. -
The
Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddCacheClearerPassclass has been removed. Use tagged iterator arguments instead. -
The
Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddCacheWarmerPassclass has been removed. Use tagged iterator arguments instead. -
The
Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TranslationDumperPassclass has been removed. Use theSymfony\Component\Translation\DependencyInjection\TranslationDumperPassclass instead. -
The
Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TranslationExtractorPassclass has been removed. Use theSymfony\Component\Translation\DependencyInjection\TranslationExtractorPassclass instead. -
The
Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TranslatorPassclass has been removed. Use theSymfony\Component\Translation\DependencyInjection\TranslatorPassclass instead. -
The
Symfony\Bundle\FrameworkBundle\Translation\TranslationLoaderclass has been deprecated and will be removed in 4.0. Use theSymfony\Component\Translation\Reader\TranslationReaderclass instead. -
The
translation.loaderservice has been removed. Use thetranslation.readerservice instead. -
AssetsInstallCommand::__construct()now requires an instance ofSymfony\Component\Filesystem\Filesystemas first argument. -
CacheClearCommand::__construct()now requires an instance ofSymfony\Component\HttpKernel\CacheClearer\CacheClearerInterfaceas first argument. -
CachePoolClearCommand::__construct()now requires an instance ofSymfony\Component\HttpKernel\CacheClearer\Psr6CacheCleareras first argument. -
EventDispatcherDebugCommand::__construct()now requires an instance ofSymfony\Component\EventDispatcher\EventDispatcherInterfaceas first argument. -
RouterDebugCommand::__construct()now requires an instance ofSymfony\Component\Routing\RouterInterfaceas first argument. -
RouterMatchCommand::__construct()now requires an instance ofSymfony\Component\Routing\RouterInterfaceas first argument. -
TranslationDebugCommand::__construct()now requires an instance ofSymfony\Component\Translation\TranslatorInterfaceas first argument. -
TranslationUpdateCommand::__construct()now requires an instance ofSymfony\Component\Translation\TranslatorInterfaceas first argument. -
The
Symfony\Bundle\FrameworkBundle\Translation\PhpExtractorclass has been deprecated and will be removed in 4.0. Use theSymfony\Component\Translation\Extractor\PhpExtractorclass instead. -
The
Symfony\Bundle\FrameworkBundle\Translation\PhpStringTokenParserclass has been deprecated and will be removed in 4.0. Use theSymfony\Component\Translation\Extractor\PhpStringTokenParserclass instead.
-
The
Request::setTrustedProxies()method takes a new$trustedHeaderSetargument. See http://symfony.com/doc/current/components/http_foundation/trusting_proxies.html for more info. -
The
Request::setTrustedHeaderName()andRequest::getTrustedHeaderName()methods have been removed. -
Extending the following methods of
Responseis no longer possible (these methods are nowfinal):setDate/getDatesetExpires/getExpiressetLastModified/getLastModifiedsetProtocolVersion/getProtocolVersionsetStatusCode/getStatusCodesetCharset/getCharsetsetPrivate/setPublicgetAgegetMaxAge/setMaxAgesetSharedMaxAgegetTtl/setTtlsetClientTtlgetEtag/setEtaghasVary/getVary/setVaryisInvalid/isSuccessful/isRedirection/isClientError/isServerErrorisOk/isForbidden/isNotFound/isRedirect/isEmpty
-
The ability to check only for cacheable HTTP methods using
Request::isMethodSafe()is not supported anymore, useRequest::isMethodCacheable()instead. -
The
Symfony\Component\HttpFoundation\Session\Storage\Handler\WriteCheckSessionHandlerclass has been removed. ImplementSessionUpdateTimestampHandlerInterfaceor extendAbstractSessionHandlerinstead. -
The
Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandlerandSymfony\Component\HttpFoundation\Session\Storage\Proxy\NativeProxyclasses have been removed. -
The
Symfony\Component\HttpFoundation\Session\Storage\Handler\MongoDbSessionHandlerdoes not work with the legacy mongo extension anymore. It requires mongodb/mongodb package and ext-mongodb. -
The
Symfony\Component\HttpFoundation\Session\Storage\Handler\MemcacheSessionHandlerclass has been removed. UseSymfony\Component\HttpFoundation\Session\Storage\Handler\MemcachedSessionHandlerinstead.
-
Bundle inheritance has been removed.
-
Relying on convention-based commands discovery is not supported anymore. Use PSR-4 based service discovery instead.
Before:
# app/config/services.yml services: # ... # implicit registration of all commands in the `Command` folder
After:
# app/config/services.yml services: # ... # explicit commands registration AppBundle\Command\: resource: '../../src/AppBundle/Command/*' tags: ['console.command']
-
The
Extension::addClassesToCompile()andExtension::getClassesToCompile()methods have been removed. -
Possibility to pass non-scalar values as URI attributes to the ESI and SSI renderers has been removed. The inline fragment renderer should be used with non-scalar attributes.
-
The
ControllerResolver::getArguments()method has been removed. If you have your ownControllerResolverInterfaceimplementation, you should inject anArgumentResolverInterfaceinstance. -
The
DataCollector::varToString()method has been removed in favor ofcloneVar(). -
The
Psr6CacheClearer::addPool()method has been removed. Pass an array of pools indexed by name to the constructor instead. -
The
LazyLoadingFragmentHandler::addRendererService()method has been removed. -
The
X-Status-Codeheader method of setting a custom status code in the response when handling exceptions has been removed. There is now a newGetResponseForExceptionEvent::allowCustomResponseCode()method instead, which will tell the Kernel to use the response code set on the event's response object. -
The
Kernel::getEnvParameters()method has been removed. -
The
SYMFONY__environment variables are no longer processed automatically by Symfony. Use the%env()%syntax to get the value of any environment variable from configuration files instead. -
The
getCacheDir()method of your kernel should not be called while building the container. Use the%kernel.cache_dir%parameter instead. Not doing so may break thecache:clearcommand. -
The
Symfony\Component\HttpKernel\Config\EnvParametersResourceclass has been removed. -
The
reset()method has been added toSymfony\Component\HttpKernel\DataCollector\DataCollectorInterface. -
The
clear()method has been added toSymfony\Component\HttpKernel\Log\DebugLoggerInterface. -
The
ChainCacheClearer::add()method has been removed, inject the list of clearers as a constructor argument instead. -
The
CacheWarmerAggregate::add()andsetWarmers()methods have been removed, inject the list of clearers as a constructor argument instead. -
The
CacheWarmerAggregateandChainCacheClearerclasses have been made final.
- The
RenameEntryInterfacehas been removed, and merged withEntryManagerInterface
-
Passing a not existing working directory to the constructor of the
Symfony\Component\Process\Processclass is not supported anymore. -
The
Symfony\Component\Process\ProcessBuilderclass has been removed, use theSymfony\Component\Process\Processclass directly instead. -
The
ProcessUtils::escapeArgument()method has been removed, use a command line array or give env vars to theProcess::start/run()method instead. -
Environment variables are always inherited in sub-processes.
-
Configuring
proc_open()options has been removed. -
Configuring Windows and sigchild compatibility is not possible anymore - they are always enabled.
-
Extending
Process::run(),Process::mustRun()andProcess::restart()is not supported anymore. -
The
getEnhanceWindowsCompatibility()andsetEnhanceWindowsCompatibility()methods of theProcessclass have been removed.
- The
profiler.matcheroption has been removed.
- The
ProxyDumperclass has been made final
-
The
RoleInterfacehas been removed. Extend theSymfony\Component\Security\Core\Role\Roleclass instead. -
The
LogoutUrlGenerator::registerListener()method expects a 6thstring $context = nullargument. -
The
AccessDecisionManager::setVoters()method has been removed. Pass the voters to the constructor instead. -
Support for defining voters that don't implement the
VoterInterfacehas been removed. -
Calling
ContextListener::setLogoutOnUserChange(false)won't have any effect anymore. -
Removed the HTTP digest authentication system. The
NonceExpiredException,DigestAuthenticationListenerandDigestAuthenticationEntryPointclasses have been removed. Use another authentication system likehttp_basicinstead. -
The
GuardAuthenticatorInterfaceinterface has been removed. UseAuthenticatorInterfaceinstead. -
When extending
AbstractGuardAuthenticatorgetCredentials() cannot returnnullanymore, return false fromsupports()if no credentials available instead.
-
The
FirewallContext::getContext()method has been removed, use thegetListeners()and/orgetExceptionListener()method instead. -
The
FirewallMap::$mapand$containerproperties have been removed. -
The
UserPasswordEncoderCommandclass does not allownullas the first argument anymore. -
UserPasswordEncoderCommanddoes not extendContainerAwareCommandnor implementContainerAwareInterfaceanymore. -
InitAclCommandhas been removed. UseSymfony\Bundle\AclBundle\Command\InitAclCommandinstead -
SetAclCommandhas been removed. UseSymfony\Bundle\AclBundle\Command\SetAclCommandinstead -
The firewall option
logout_on_user_changeis now always true, which will trigger a logout if the user changes between requests. -
Removed the HTTP digest authentication system. The
HttpDigestFactoryclass has been removed. Use another authentication system likehttp_basicinstead. -
The
switch_user.statelessoption is now always true if the firewall is stateless. -
Not configuring explicitly the provider on a firewall is ambiguous when there is more than one registered provider. The first configured provider is not used anymore and an exception is thrown instead. Explicitly configure the provider to use on your firewalls.
-
The ability to pass a Doctrine
Cacheinstance to theClassMetadataFactoryclass has been removed. You should use theCacheClassMetadataFactoryclass instead. -
Not defining the 6th argument
$format = nullof theAbstractNormalizer::instantiateObject()method when overriding it is not supported anymore. -
Extending
ChainDecoder,ChainEncoder,ArrayDenormalizeris not supported anymore.
-
Removed the backup feature from the file dumper classes.
-
The default value of the
$readerServiceIdargument ofTranslatorPass::__construct()has been changed to"translation.reader". -
Removed
Symfony\Component\Translation\Writer\TranslationWriter::writeTranslations, useSymfony\Component\Translation\Writer\TranslationWriter::writeinstead. -
Removed support for passing
Symfony\Component\Translation\MessageSelectoras a second argument to theTranslator::__construct(). You should pass an instance ofSymfony\Component\Translation\Formatter\MessageFormatterInterfaceinstead.
-
The
ContainerAwareRuntimeLoaderclass has been removed. Use the TwigTwig_ContainerRuntimeLoaderclass instead. -
Removed
DebugCommandin favor ofSymfony\Bridge\Twig\Command\DebugCommand. -
Removed
ContainerAwareInterfaceimplementation inSymfony\Bundle\TwigBundle\Command\LintCommand.
-
removed the
Symfony\Bridge\Twig\Form\TwigRendererclass, use theFormRendererclass from the Form component instead -
Removed the possibility to inject the Form
TwigRendererinto theFormExtension. Upgrade Twig to^1.30, inject theTwig_Environmentinto theTwigRendererEngineand load theTwigRendererusing theTwig_FactoryRuntimeLoaderinstead.Before:
use Symfony\Bridge\Twig\Extension\FormExtension; use Symfony\Bridge\Twig\Form\TwigRenderer; use Symfony\Bridge\Twig\Form\TwigRendererEngine; // ... $rendererEngine = new TwigRendererEngine(['form_div_layout.html.twig']); $rendererEngine->setEnvironment($twig); $twig->addExtension(new FormExtension(new TwigRenderer($rendererEngine, $csrfTokenManager)));
After:
$rendererEngine = new TwigRendererEngine(['form_div_layout.html.twig'], $twig); $twig->addRuntimeLoader(new \Twig_FactoryRuntimeLoader([ TwigRenderer::class => function () use ($rendererEngine, $csrfTokenManager) { return new TwigRenderer($rendererEngine, $csrfTokenManager); }, ])); $twig->addExtension(new FormExtension());
-
Removed the
TwigRendererEngineInterfaceinterface. -
The
TwigRendererEngine::setEnvironment()method has been removed. Pass the Twig Environment as second argument of the constructor instead. -
Removed
DebugCommand::set/getTwigEnvironment. Pass an instance ofTwig\Environmentas first argument of the constructor instead. -
Removed
LintCommand::set/getTwigEnvironment. Pass an instance ofTwig\Environmentas first argument of the constructor instead.
-
The default value of the
strictoption of theChoiceconstraint was changed totrue. Using any other value will throw an exception. -
The
DateTimeValidator::PATTERNconstant was removed. -
Tests\Constraints\AbstractConstraintValidatorTesthas been removed in favor ofTest\ConstraintValidatorTestCase.Before:
// ... use Symfony\Component\Validator\Tests\Constraints\AbstractConstraintValidatorTest; class MyCustomValidatorTest extends AbstractConstraintValidatorTest { // ... }
After:
// ... use Symfony\Component\Validator\Test\ConstraintValidatorTestCase; class MyCustomValidatorTest extends ConstraintValidatorTestCase { // ... }
-
Setting the
checkDNSoption of theUrlconstraint totrueis dropped in favor ofUrl::CHECK_DNS_TYPE_*constants values.Before:
$constraint = new Url(['checkDNS' => true]);
After:
$constraint = new Url(['checkDNS' => Url::CHECK_DNS_TYPE_ANY]);
-
The
VarDumperTestTrait::assertDumpEquals()method expects a 3rd$context = nullargument and moves$message = ''argument at 4th position.Before:
VarDumperTestTrait::assertDumpEquals($dump, $data, $message = '');
After:
VarDumperTestTrait::assertDumpEquals($dump, $data, $filter = 0, $message = '');
-
The
VarDumperTestTrait::assertDumpMatchesFormat()method expects a 3rd$context = nullargument and moves$message = ''argument at 4th position.Before:
VarDumperTestTrait::assertDumpMatchesFormat($dump, $data, $message = '');
After:
VarDumperTestTrait::assertDumpMatchesFormat($dump, $data, $filter = 0, $message = '');
- Removed the
getTemplates()method of theTemplateManagerclass in favor of thegetNames()method
- Removed class name support in
WorkflowRegistry::add()as second parameter.
-
Support for the
!strtag was removed, use the!!strtag instead. -
Starting an unquoted string with a question mark followed by a space throws a
ParseException. -
Removed support for implicitly parsing non-string mapping keys as strings. Mapping keys that are no strings will result in a
ParseException. Use quotes to opt-in for keys to be parsed as strings.Before:
$yaml = <<<YAML null: null key true: boolean true 2.0: float key YAML; Yaml::parse($yaml);
After:
$yaml = <<<YAML "null": null key "true": boolean true "2.0": float key YAML; Yaml::parse($yaml);
-
Removed the
Yaml::PARSE_KEYS_AS_STRINGSflag.Before:
$yaml = <<<YAML null: null key true: boolean true 2.0: float key YAML; Yaml::parse($yaml, Yaml::PARSE_KEYS_AS_STRINGS);
After:
$yaml = <<<YAML "null": null key "true": boolean true "2.0": float key YAML; Yaml::parse($yaml);
-
Omitting the key of a mapping is not supported anymore and throws a
ParseException. -
Mappings with a colon (
:) that is not followed by a whitespace are not supported anymore and lead to aParseException(e.g.foo:barmust befoo: bar). -
Starting an unquoted string with
%leads to aParseException. -
The
Dumper::setIndentation()method was removed. Pass the indentation level to the constructor instead. -
Removed support for passing
true/falseas the second argument to theparse()method to trigger exceptions when an invalid type was passed.Before:
Yaml::parse('{ "foo": "bar", "fiz": "cat" }', true);
After:
Yaml::parse('{ "foo": "bar", "fiz": "cat" }', Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE);
-
Removed support for passing
true/falseas the third argument to theparse()method to toggle object support.Before:
Yaml::parse('{ "foo": "bar", "fiz": "cat" }', false, true);
After:
Yaml::parse('{ "foo": "bar", "fiz": "cat" }', Yaml::PARSE_OBJECT);
-
Removed support for passing
true/falseas the fourth argument to theparse()method to parse objects as maps.Before:
Yaml::parse('{ "foo": "bar", "fiz": "cat" }', false, false, true);
After:
Yaml::parse('{ "foo": "bar", "fiz": "cat" }', Yaml::PARSE_OBJECT_FOR_MAP);
-
Removed support for passing
true/falseas the fourth argument to thedump()method to trigger exceptions when an invalid type was passed.Before:
Yaml::dump(['foo' => new A(), 'bar' => 1], 0, 0, true);
After:
Yaml::dump(['foo' => new A(), 'bar' => 1], 0, 0, Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE);
-
Removed support for passing
true/falseas the fifth argument to thedump()method to toggle object support.Before:
Yaml::dump(['foo' => new A(), 'bar' => 1], 0, 0, false, true);
After:
Yaml::dump(['foo' => new A(), 'bar' => 1], 0, 0, false, Yaml::DUMP_OBJECT);
-
The
!!php/objecttag to indicate dumped PHP objects was removed in favor of the!php/objecttag. -
Duplicate mapping keys lead to a
ParseException. -
The constructor arguments
$offset,$totalNumberOfLinesand$skippedLineNumbersof theParserclass were removed. -
The behavior of the non-specific tag
!is changed and now forces non-evaluating your values. -
The
!php/object:tag was removed in favor of the!php/objecttag (without the colon). -
The
!php/const:tag was removed in favor of the!php/consttag (without the colon).Before:
!php/const:PHP_INT_MAXAfter:
!php/const PHP_INT_MAX