This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
symfony/UPGRADE-3.4.md

18 KiB

UPGRADE FROM 3.3 to 3.4

Config

  • The protected TreeBuilder::$builder property is deprecated and will be removed in 4.0.

DependencyInjection

  • Definitions and aliases will be made 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 deprecated and won't be supported in Symfony 4.0. 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 code
    
    services:
        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 deprecated and will not be supported anymore in Symfony 4.0 where it will only match an alias or a service id that matches then given FQCN. You can opt in the behavior of Symfony 4 by the enabling the container.autowiring.strict_mode parameter:

    parameters:
        container.autowiring.strict_mode: true
    
  • Top-level anonymous services in XML are deprecated and will throw an exception in Symfony 4.0.

  • Case insensitivity of parameter names is deprecated and will be removed in 4.0.

  • The ResolveDefinitionTemplatesPass class is deprecated and will be removed in 4.0. Use the ResolveChildDefinitionsPass class instead.

  • Unless you're using a custom autoloader, you should enable the container.dumper.inline_class_loader parameter. This can drastically improve DX by reducing the time to load classes when the DebugClassLoader is enabled. If you're using FrameworkBundle, this performance improvement will also impact the "dev" environment:

    parameters:
        container.dumper.inline_class_loader: true
    

Debug

  • Support for stacked errors in the ErrorHandler is deprecated and will be removed in Symfony 4.0.

DoctrineBridge

  • Deprecated Symfony\Bridge\Doctrine\HttpFoundation\DbalSessionHandler and Symfony\Bridge\Doctrine\HttpFoundation\DbalSessionHandlerSchema. Use Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler instead.

EventDispatcher

  • Implementing TraceableEventDispatcherInterface without the reset() method is deprecated and will be unsupported in 4.0.

Filesystem

  • The Symfony\Component\Filesystem\LockHandler class has been deprecated, use the Symfony\Component\Lock\Store\FlockStore class or the Symfony\Component\Lock\Store\FlockStore\SemaphoreStore class directly instead.
  • Support for passing relative paths to Filesystem::makePathRelative() is deprecated and will be removed in 4.0.

Finder

  • The Symfony\Component\Finder\Iterator\FilterIterator class has been deprecated and will be removed in 4.0 as it used to fix a bug which existed before version 5.5.23/5.6.7.

Form

  • Deprecated ChoiceLoaderInterface implementation in TimezoneType. 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
        }
    }
    

FrameworkBundle

  • The session.use_strict_mode option has been deprecated and is enabled by default.

  • The cache:clear command doesn't clear "app" PSR-6 cache pools anymore, but still clears "system" ones. Use the cache:pool:clear command to clear "app" pools instead.

  • The doctrine/cache dependency has been removed; require it via composer require doctrine/cache if you are using Doctrine cache in your project.

  • The validator.mapping.cache.doctrine.apc service has been deprecated.

  • The symfony/stopwatch dependency has been removed, require it via composer require symfony/stopwatch in your dev environment.

  • Using the KERNEL_DIR environment variable or the automatic guessing based on the phpunit.xml / phpunit.xml.dist file location is deprecated since 3.4. Set the KERNEL_CLASS environment variable to the fully-qualified class name of your Kernel instead. Not setting the KERNEL_CLASS environment variable will throw an exception on 4.0 unless you override the KernelTestCase::createKernel() or KernelTestCase::getKernelClass() method.

  • The KernelTestCase::getPhpUnitXmlDir() and KernelTestCase::getPhpUnitCliConfigArgument() methods are deprecated since 3.4 and will be removed in 4.0.

  • The --no-prefix option of the translation:update command is deprecated and will be removed in 4.0. Use the --prefix option with an empty string as value instead (e.g. --prefix="")

  • The Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddCacheClearerPass class has been deprecated and will be removed in 4.0. Use tagged iterator arguments instead.

  • The Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddCacheWarmerPass class has been deprecated and will be removed in 4.0. Use tagged iterator arguments instead.

  • The Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TranslationDumperPass class has been deprecated and will be removed in 4.0. Use the Symfony\Component\Translation\DependencyInjection\TranslationDumperPass class instead.

  • The Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TranslationExtractorPass class has been deprecated and will be removed in 4.0. Use the Symfony\Component\Translation\DependencyInjection\TranslationExtractorPass class instead.

  • The Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TranslatorPass class has been deprecated and will be removed in 4.0. Use the Symfony\Component\Translation\DependencyInjection\TranslatorPass class instead.

  • The Symfony\Bundle\FrameworkBundle\Translation\TranslationLoader class has been deprecated and will be removed in 4.0. Use the Symfony\Component\Translation\Reader\TranslationReader class instead.

  • The translation.loader service has been deprecated and will be removed in 4.0. Use the translation.reader service instead..

  • AssetsInstallCommand::__construct() now takes an instance of Symfony\Component\Filesystem\Filesystem as first argument. Not passing it is deprecated and will throw a TypeError in 4.0.

  • CacheClearCommand::__construct() now takes an instance of Symfony\Component\HttpKernel\CacheClearer\CacheClearerInterface as first argument. Not passing it is deprecated and will throw a TypeError in 4.0.

  • CachePoolClearCommand::__construct() now takes an instance of Symfony\Component\HttpKernel\CacheClearer\Psr6CacheClearer as first argument. Not passing it is deprecated and will throw a TypeError in 4.0.

  • EventDispatcherDebugCommand::__construct() now takes an instance of Symfony\Component\EventDispatcher\EventDispatcherInterface as first argument. Not passing it is deprecated and will throw a TypeError in 4.0.

  • RouterDebugCommand::__construct() now takes an instance of Symfony\Component\Routing\RouterInterface as first argument. Not passing it is deprecated and will throw a TypeError in 4.0.

  • RouterMatchCommand::__construct() now takes an instance of Symfony\Component\Routing\RouterInterface as first argument. Not passing it is deprecated and will throw a TypeError in 4.0.

  • TranslationDebugCommand::__construct() now takes an instance of Symfony\Component\Translation\TranslatorInterface as first argument. Not passing it is deprecated and will throw a TypeError in 4.0.

  • TranslationUpdateCommand::__construct() now takes an instance of Symfony\Component\Translation\TranslatorInterface as first argument. Not passing it is deprecated and will throw a TypeError in 4.0.

  • AssetsInstallCommand, CacheClearCommand, CachePoolClearCommand, EventDispatcherDebugCommand, RouterDebugCommand, RouterMatchCommand, TranslationDebugCommand, TranslationUpdateCommand, XliffLintCommand and YamlLintCommand classes have been marked as final

  • The Symfony\Bundle\FrameworkBundle\Translation\PhpExtractor class has been deprecated and will be removed in 4.0. Use the Symfony\Component\Translation\Extractor\PhpExtractor class instead.

  • The Symfony\Bundle\FrameworkBundle\Translation\PhpStringTokenParser class has been deprecated and will be removed in 4.0. Use the Symfony\Component\Translation\Extractor\PhpStringTokenParser class instead.

HttpFoundation

  • The Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandler class has been deprecated and will be removed in 4.0. Use the \SessionHandler class instead.

  • The Symfony\Component\HttpFoundation\Session\Storage\Handler\WriteCheckSessionHandler class has been deprecated and will be removed in 4.0. Implement SessionUpdateTimestampHandlerInterface or extend AbstractSessionHandler instead.

  • The Symfony\Component\HttpFoundation\Session\Storage\Proxy\NativeProxy class has been deprecated and will be removed in 4.0. Use your \SessionHandlerInterface implementation directly.

  • Using Symfony\Component\HttpFoundation\Session\Storage\Handler\MongoDbSessionHandler with the legacy mongo extension has been deprecated and will be removed in 4.0. Use it with the mongodb/mongodb package and ext-mongodb instead.

  • The Symfony\Component\HttpFoundation\Session\Storage\Handler\MemcacheSessionHandler class has been deprecated and will be removed in 4.0. Use Symfony\Component\HttpFoundation\Session\Storage\Handler\MemcachedSessionHandler instead.

HttpKernel

  • Bundle inheritance has been deprecated.

  • Relying on convention-based commands discovery has been deprecated and won't be supported in 4.0. 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 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 the cache:clear command.

  • The Symfony\Component\HttpKernel\Config\EnvParametersResource class has been deprecated and will be removed in 4.0.

  • Implementing DataCollectorInterface without a reset() method has been deprecated and will be unsupported in 4.0.

  • Implementing DebugLoggerInterface without a clear() method has been deprecated and will be unsupported in 4.0.

  • The ChainCacheClearer::add() method has been deprecated and will be removed in 4.0, inject the list of clearers as a constructor argument instead.

  • The CacheWarmerAggregate::add() and setWarmers() methods have been deprecated and will be removed in 4.0, inject the list of clearers as a constructor argument instead.

  • The CacheWarmerAggregate and ChainCacheClearer classes have been made final.

Process

  • The Symfony\Component\Process\ProcessBuilder class has been deprecated, use the Symfony\Component\Process\Process class directly instead.

  • Calling Process::start() without setting a valid working directory (via setWorkingDirectory() or constructor) beforehand is deprecated and will throw an exception in 4.0.

Profiler

  • The profiler.matcher option has been deprecated.

Security

  • Deprecated the HTTP digest authentication: NonceExpiredException, DigestAuthenticationListener and DigestAuthenticationEntryPoint will be removed in 4.0. Use another authentication system like http_basic instead.

  • The GuardAuthenticatorInterface has been deprecated and will be removed in 4.0. Use AuthenticatorInterface instead.

  • When extending AbstractGuardAuthenticator it's deprecated to return null from getCredentials(). Return false from supports() if no credentials available.

SecurityBundle

  • Using voters that do not implement the VoterInterfaceis now deprecated in the AccessDecisionManager and this functionality will be removed in 4.0.

  • FirewallContext::getListeners() now returns \Traversable|array

  • InitAclCommand::__construct() now takes an instance of Doctrine\DBAL\Connection as first argument. Not passing it is deprecated and will throw a TypeError in 4.0.

  • The acl:set command has been deprecated along with the SetAclCommand class, both will be removed in 4.0. Install symfony/acl-bundle instead

  • The init:acl command has been deprecated along with the InitAclCommand class, both will be removed in 4.0. Install symfony/acl-bundle and use acl:init instead

  • Added logout_on_user_change to the firewall options. This config item will trigger a logout when the user has changed. Should be set to true to avoid deprecations in the configuration.

  • Deprecated the HTTP digest authentication: HttpDigestFactory will be removed in 4.0. Use another authentication system like http_basic instead.

  • Deprecated setting the switch_user.stateless option to false when the firewall is stateless. Setting it to false will have no effect in 4.0.

  • Not configuring explicitly the provider on a firewall is ambiguous when there is more than one registered provider. Using the first configured provider is deprecated since 3.4 and will throw an exception on 4.0. Explicitly configure the provider to use on your firewalls.

Translation

  • Symfony\Component\Translation\Writer\TranslationWriter::writeTranslations has been deprecated and will be removed in 4.0, use Symfony\Component\Translation\Writer\TranslationWriter::write instead.

  • Passing a Symfony\Component\Translation\MessageSelector to Translator has been deprecated. You should pass a message formatter instead

    Before:

    use Symfony\Component\Translation\Translator;
    use Symfony\Component\Translation\MessageSelector;
    
    $translator = new Translator('fr_FR', new MessageSelector());
    

    After:

    use Symfony\Component\Translation\Translator;
    use Symfony\Component\Translation\Formatter\MessageFormatter;
    
    $translator = new Translator('fr_FR', new MessageFormatter());
    

TwigBridge

  • deprecated the Symfony\Bridge\Twig\Form\TwigRenderer class, use the FormRenderer class from the Form component instead

    • the service twig.form.renderer is now an instance of FormRenderer. So you might have to adjust your type-hints to FormRendererInterface if you are still relying on the TwigRendererInterface which was deprecated in Symfony 3.2

    • retrieving the Renderer runtime from the twig environment via $twig->getRuntime('Symfony\Bridge\Twig\Form\TwigRenderer') is not working anymore and should be replaced with $twig->getRuntime('Symfony\Component\Form\FormRenderer') instead

  • deprecated Symfony\Bridge\Twig\Command\DebugCommand::set/getTwigEnvironment and the ability to pass a command name as first argument

  • deprecated Symfony\Bridge\Twig\Command\LintCommand::set/getTwigEnvironment and the ability to pass a command name as first argument

TwigBundle

  • deprecated the Symfony\Bundle\TwigBundle\Command\DebugCommand class, use the DebugCommand class from the Twig bridge instead

  • deprecated relying on the ContainerAwareInterface implementation for Symfony\Bundle\TwigBundle\Command\LintCommand

Validator

  • Not setting the strict option of the Choice constraint to true is deprecated and will throw an exception in Symfony 4.0.

Yaml

  • the Dumper, Parser, and Yaml classes are marked as final

  • using the !php/object: tag is deprecated and won't be supported in 4.0. Use the !php/object tag (without the colon) instead.

  • using the !php/const: tag is deprecated and won't be supported in 4.0. Use the !php/const tag (without the colon) instead.

    Before:

    !php/const:PHP_INT_MAX
    

    After:

    !php/const PHP_INT_MAX
    
  • Support for the !str tag is deprecated, use the !!str tag instead.

  • Using the non-specific tag ! is deprecated and will have a different behavior in 4.0. Use a plain integer or !!float instead.

  • Using the Yaml::PARSE_KEYS_AS_STRINGS flag is deprecated as it will be removed in 4.0.

    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);