CHANGELOG ========= 7.1 --- * Add `CheckAliasValidityPass` to check service compatibility with aliased interface * Add argument `$prepend` to `ContainerConfigurator::extension()` to prepend the configuration instead of appending it * Have `ServiceLocator` implement `ServiceCollectionInterface` * Add `#[Lazy]` attribute as shortcut for `#[Autowire(lazy: [bool|string])]` and `#[Autoconfigure(lazy: [bool|string])]` * Add `#[AutowireMethodOf]` attribute to autowire a method of a service as a callable * Make `ContainerBuilder::registerAttributeForAutoconfiguration()` propagate to attribute classes that extend the registered class * Add argument `$prepend` to `FileLoader::construct()` to prepend loaded configuration instead of appending it * [BC BREAK] When used in the `prependExtension()` method, the `ContainerConfigurator::import()` method now prepends the configuration instead of appending it * Cast env vars to null or bool when referencing them using `#[Autowire(env: '...')]` depending on the signature of the corresponding parameter * Add `#[AutowireInline]` attribute to allow service definition at the class level * Add `StaticEnvVarLoader` 7.0 --- * Remove `#[MapDecorated]`, use `#[AutowireDecorated]` instead * Remove `ProxyHelper`, use `Symfony\Component\VarExporter\ProxyHelper` instead * Remove `ReferenceSetArgumentTrait` * Remove support of `@required` annotation, use the `Symfony\Contracts\Service\Attribute\Required` attribute instead * Require explicit argument when calling `ContainerAwareTrait::setContainer()` * Remove `PhpDumper` options `inline_factories_parameter` and `inline_class_loader_parameter`, use options `inline_factories` and `inline_class_loader` instead * Parameter names of `ParameterBag` cannot be numerics * Remove `ContainerAwareInterface` and `ContainerAwareTrait`, use dependency injection instead * Add argument `$id` and `$asGhostObject` to `DumperInterface::isProxyCandidate()` and `getProxyCode()` * Add argument `$source` to `FileLoader::registerClasses()` 6.4 --- * Allow using `#[Target]` with no arguments to state that a parameter must match a named autowiring alias * Deprecate `ContainerAwareInterface` and `ContainerAwareTrait`, use dependency injection instead * Add `defined` env var processor that returns `true` for defined and neither null nor empty env vars * Add `#[AutowireLocator]` and `#[AutowireIterator]` attributes * Add `urlencode` env var processor that url encodes a string value 6.3 --- * Add options `inline_factories` and `inline_class_loader` to `PhpDumper::dump()` * Deprecate `PhpDumper` options `inline_factories_parameter` and `inline_class_loader_parameter` * Add `RemoveBuildParametersPass`, which removes parameters starting with a dot during compilation * Add support for nesting autowiring-related attributes into `#[Autowire(...)]` * Deprecate undefined and numeric keys with `service_locator` config * Fail if Target attribute does not exist during compilation * Enable deprecating parameters with `ContainerBuilder::deprecateParameter()` * Add `#[AsAlias]` attribute to tell under which alias a service should be registered or to use the implemented interface if no parameter is given * Allow to trim XML service parameters value by using `trim="true"` attribute * Allow extending the `Autowire` attribute * Add `#[Exclude]` to skip autoregistering a class * Add support for generating lazy closures * Add support for autowiring services as closures using `#[AutowireCallable]` or `#[AutowireServiceClosure]` * Add support for `#[Autowire(lazy: true|class-string)]` * Make it possible to cast callables into single-method interfaces * Deprecate `#[MapDecorated]`, use `#[AutowireDecorated]` instead * Deprecate the `@required` annotation, use the `Symfony\Contracts\Service\Attribute\Required` attribute instead * Add `constructor` option to services declaration and to `#[Autoconfigure]` 6.2 --- * Use lazy-loading ghost objects and virtual proxies out of the box * Add arguments `&$asGhostObject` and `$id` to LazyProxy's `DumperInterface` to allow using ghost objects for lazy loading services * Add `enum` env var processor * Add `shuffle` env var processor * Allow #[When] to be extended * Change the signature of `ContainerAwareInterface::setContainer()` to `setContainer(?ContainerInterface)` * Deprecate calling `ContainerAwareTrait::setContainer()` without arguments * Deprecate using numeric parameter names * Add support for tagged iterators/locators `exclude` option to the xml and yaml loaders/dumpers * Allow injecting `string $env` into php config closures * Add `excludeSelf` parameter to `TaggedIteratorArgument` with default value to `true` to control whether the referencing service should be automatically excluded from the iterator 6.1 --- * Add `#[MapDecorated]` attribute telling to which parameter the decorated service should be mapped in a decorator * Add `#[AsDecorator]` attribute to make a service decorates another * Add `$exclude` to `TaggedIterator` and `TaggedLocator` attributes * Add `$exclude` to `tagged_iterator` and `tagged_locator` configurator * Add an `env` function to the expression language provider * Add an `Autowire` attribute to tell a parameter how to be autowired * Allow using expressions as service factories * Add argument type `closure` to help passing closures to services * Deprecate `ReferenceSetArgumentTrait` * Add `AbstractExtension` class for DI configuration/definition on a single file 6.0 --- * Remove `Definition::setPrivate()` and `Alias::setPrivate()`, use `setPublic()` instead * Remove `inline()` in favor of `inline_service()` and `ref()` in favor of `service()` when using the PHP-DSL * Remove `Definition::getDeprecationMessage()`, use `Definition::getDeprecation()` instead * Remove `Alias::getDeprecationMessage()`, use `Alias::getDeprecation()` instead * Remove the `Psr\Container\ContainerInterface` and `Symfony\Component\DependencyInjection\ContainerInterface` aliases of the `service_container` service 5.4 --- * Add `$defaultIndexMethod` and `$defaultPriorityMethod` to `TaggedIterator` and `TaggedLocator` attributes * Add `service_closure()` to the PHP-DSL * Add support for autoconfigurable attributes on methods, properties and parameters * Make auto-aliases private by default * Add support for autowiring union and intersection types 5.3 --- * Add `ServicesConfigurator::remove()` in the PHP-DSL * Add `%env(not:...)%` processor to negate boolean values * Add support for loading autoconfiguration rules via the `#[Autoconfigure]` and `#[AutoconfigureTag]` attributes on PHP 8 * Add `#[AsTaggedItem]` attribute for defining the index and priority of classes found in tagged iterators/locators * Add autoconfigurable attributes * Add support for autowiring tagged iterators and locators via attributes on PHP 8 * Add support for per-env configuration in XML and Yaml loaders * Add `ContainerBuilder::willBeAvailable()` to help with conditional configuration * Add support an integer return value for default_index_method * Add `#[When(env: 'foo')]` to skip autoregistering a class when the env doesn't match * Add `env()` and `EnvConfigurator` in the PHP-DSL * Add support for `ConfigBuilder` in the `PhpFileLoader` * Add `ContainerConfigurator::env()` to get the current environment * Add `#[Target]` to tell how a dependency is used and hint named autowiring aliases 5.2.0 ----- * added `param()` and `abstract_arg()` in the PHP-DSL * deprecated `Definition::setPrivate()` and `Alias::setPrivate()`, use `setPublic()` instead * added support for the `#[Required]` attribute 5.1.0 ----- * deprecated `inline()` in favor of `inline_service()` and `ref()` in favor of `service()` when using the PHP-DSL * allow decorators to reference their decorated service using the special `.inner` id * added support to autowire public typed properties in php 7.4 * added support for defining method calls, a configurator, and property setters in `InlineServiceConfigurator` * added possibility to define abstract service arguments * allowed mixing "parent" and instanceof-conditionals/defaults/bindings * updated the signature of method `Definition::setDeprecated()` to `Definition::setDeprecation(string $package, string $version, string $message)` * updated the signature of method `Alias::setDeprecated()` to `Alias::setDeprecation(string $package, string $version, string $message)` * updated the signature of method `DeprecateTrait::deprecate()` to `DeprecateTrait::deprecation(string $package, string $version, string $message)` * deprecated the `Psr\Container\ContainerInterface` and `Symfony\Component\DependencyInjection\ContainerInterface` aliases of the `service_container` service, configure them explicitly instead * added class `Symfony\Component\DependencyInjection\Dumper\Preloader` to help with preloading on PHP 7.4+ * added tags `container.preload`/`.no_preload` to declare extra classes to preload/services to not preload * allowed loading and dumping tags with an attribute named "name" * deprecated `Definition::getDeprecationMessage()`, use `Definition::getDeprecation()` instead * deprecated `Alias::getDeprecationMessage()`, use `Alias::getDeprecation()` instead * added support of PHP8 static return type for withers * added `AliasDeprecatedPublicServicesPass` to deprecate public services to private 5.0.0 ----- * removed support for auto-discovered extension configuration class which does not implement `ConfigurationInterface` * removed support for non-string default env() parameters * moved `ServiceSubscriberInterface` to the `Symfony\Contracts\Service` namespace * removed `RepeatedPass` and `RepeatablePassInterface` * removed support for short factory/configurator syntax from `YamlFileLoader` * removed `ResettableContainerInterface`, use `ResetInterface` instead * added argument `$returnsClone` to `Definition::addMethodCall()` * removed `tagged`, use `tagged_iterator` instead 4.4.0 ----- * added `CheckTypeDeclarationsPass` to check injected parameters type during compilation * added support for opcache.preload by generating a preloading script in the cache folder * added support for dumping the container in one file instead of many files * deprecated support for short factories and short configurators in Yaml * added `tagged_iterator` alias for `tagged` which might be deprecated in a future version * deprecated passing an instance of `Symfony\Component\DependencyInjection\Parameter` as class name to `Symfony\Component\DependencyInjection\Definition` * added support for binding iterable and tagged services * made singly-implemented interfaces detection be scoped by file * added ability to define a static priority method for tagged service * added support for improved syntax to define method calls in Yaml * made the `%env(base64:...)%` processor able to decode base64url * added ability to choose behavior of decorations on non existent decorated services 4.3.0 ----- * added `%env(trim:...)%` processor to trim a string value * added `%env(default:param_name:...)%` processor to fallback to a parameter or to null when using `%env(default::...)%` * added `%env(url:...)%` processor to convert a URL or DNS into an array of components * added `%env(query_string:...)%` processor to convert a query string into an array of key values * added support for deprecating aliases * made `ContainerParametersResource` final and not implement `Serializable` anymore * added `ReverseContainer`: a container that turns services back to their ids * added ability to define an index for a tagged collection * added ability to define an index for services in an injected service locator argument * made `ServiceLocator` implement `ServiceProviderInterface` * deprecated support for non-string default env() parameters * added `%env(require:...)%` processor to `require()` a PHP file and use the value returned from it 4.2.0 ----- * added `ContainerBuilder::registerAliasForArgument()` to support autowiring by type+name * added support for binding by type+name * added `ServiceSubscriberTrait` to ease implementing `ServiceSubscriberInterface` using methods' return types * added `ServiceLocatorArgument` and `!service_locator` config tag for creating optimized service-locators * added support for autoconfiguring bindings * added `%env(key:...)%` processor to fetch a specific key from an array * deprecated `ServiceSubscriberInterface`, use the same interface from the `Symfony\Contracts\Service` namespace instead * deprecated `ResettableContainerInterface`, use `Symfony\Contracts\Service\ResetInterface` instead 4.1.0 ----- * added support for variadics in named arguments * added PSR-11 `ContainerBagInterface` and its `ContainerBag` implementation to access parameters as-a-service * added support for service's decorators autowiring * deprecated the `TypedReference::canBeAutoregistered()` and `TypedReference::getRequiringClass()` methods * environment variables are validated when used in extension configuration * deprecated support for auto-discovered extension configuration class which does not implement `ConfigurationInterface` 4.0.0 ----- * 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: ```php namespace App\Controller; use App\Mailer; class DefaultController { public function __construct(Mailer $mailer) { // ... } // ... } ``` ```yml services: App\Controller\DefaultController: autowire: true ``` After: ```php // same PHP code ``` ```yml services: App\Controller\DefaultController: autowire: true # or # App\Controller\DefaultController: # arguments: { $mailer: "@App\Mailer" } App\Mailer: autowire: true ``` * removed autowiring services based on the types they implement * added a third `$methodName` argument to the `getProxyFactoryCode()` method of the `DumperInterface` * removed support for autowiring types * removed `Container::isFrozen` * removed support for dumping an ucompiled container in `PhpDumper` * removed support for generating a dumped `Container` without populating the method map * removed support for case insensitive service identifiers * removed the `DefinitionDecorator` class, replaced by `ChildDefinition` * removed the `AutowireServiceResource` class and related `AutowirePass::createResourceForClass()` method * removed `LoggingFormatter`, `Compiler::getLoggingFormatter()` and `addLogMessage()` class and methods, use the `ContainerBuilder::log()` method instead * removed `FactoryReturnTypePass` * removed `ContainerBuilder::addClassResource()`, use the `addObjectResource()` or the `getReflectionClass()` method instead. * removed support for top-level anonymous services * removed silent behavior for unused attributes and elements * removed support for setting and accessing private services in `Container` * removed support for setting pre-defined services in `Container` * removed support for case insensitivity of parameter names * removed `AutowireExceptionPass` and `AutowirePass::getAutowiringExceptions()`, use `Definition::addError()` and the `DefinitionErrorExceptionPass` instead 3.4.0 ----- * moved the `ExtensionCompilerPass` to before-optimization passes with priority -1000 * deprecated "public-by-default" definitions and aliases, the new default will be "private" in 4.0 * added `EnvVarProcessorInterface` and corresponding "container.env_var_processor" tag for processing env vars * added support for ignore-on-uninitialized references * deprecated service auto-registration while autowiring * deprecated the ability to check for the initialization of a private service with the `Container::initialized()` method * deprecated support for top-level anonymous services in XML * deprecated case insensitivity of parameter names * deprecated the `ResolveDefinitionTemplatesPass` class in favor of `ResolveChildDefinitionsPass` * added `TaggedIteratorArgument` with YAML (`!tagged foo`) and XML (``) support * deprecated `AutowireExceptionPass` and `AutowirePass::getAutowiringExceptions()`, use `Definition::addError()` and the `DefinitionErrorExceptionPass` instead 3.3.0 ----- * deprecated autowiring services based on the types they implement; rename (or alias) your services to their FQCN id to make them autowirable * added "ServiceSubscriberInterface" - to allow for per-class explicit service-locator definitions * added "container.service_locator" tag for defining service-locator services * added anonymous services support in YAML configuration files using the `!service` tag. * added "TypedReference" and "ServiceClosureArgument" for creating service-locator services * added `ServiceLocator` - a PSR-11 container holding a set of services to be lazily loaded * added "instanceof" section for local interface-defined configs * added prototype services for PSR4-based discovery and registration * added `ContainerBuilder::getReflectionClass()` for retrieving and tracking reflection class info * deprecated `ContainerBuilder::getClassResource()`, use `ContainerBuilder::getReflectionClass()` or `ContainerBuilder::addObjectResource()` instead * added `ContainerBuilder::fileExists()` for checking and tracking file or directory existence * deprecated autowiring-types, use aliases instead * added support for omitting the factory class name in a service definition if the definition class is set * deprecated case insensitivity of service identifiers * added "iterator" argument type for lazy iteration over a set of values and services * added file-wide configurable defaults for service attributes "public", "tags", "autowire" and "autoconfigure" * made the "class" attribute optional, using the "id" as fallback * using the `PhpDumper` with an uncompiled `ContainerBuilder` is deprecated and will not be supported anymore in 4.0 * deprecated the `DefinitionDecorator` class in favor of `ChildDefinition` * allow config files to be loaded using a glob pattern * [BC BREAK] the `NullDumper` class is now final 3.2.0 ----- * allowed to prioritize compiler passes by introducing a third argument to `PassConfig::addPass()`, to `Compiler::addPass` and to `ContainerBuilder::addCompilerPass()` * added support for PHP constants in YAML configuration files * deprecated the ability to set or unset a private service with the `Container::set()` method * deprecated the ability to check for the existence of a private service with the `Container::has()` method * deprecated the ability to request a private service with the `Container::get()` method * deprecated support for generating a dumped `Container` without populating the method map 3.0.0 ----- * removed all deprecated codes from 2.x versions 2.8.0 ----- * deprecated the abstract ContainerAware class in favor of ContainerAwareTrait * deprecated IntrospectableContainerInterface, to be merged with ContainerInterface in 3.0 * allowed specifying a directory to recursively load all configuration files it contains * deprecated the concept of scopes * added `Definition::setShared()` and `Definition::isShared()` * added ResettableContainerInterface to be able to reset the container to release memory on shutdown * added a way to define the priority of service decoration * added support for service autowiring 2.7.0 ----- * deprecated synchronized services 2.6.0 ----- * added new factory syntax and deprecated the old one 2.5.0 ----- * added DecoratorServicePass and a way to override a service definition (Definition::setDecoratedService()) * deprecated SimpleXMLElement class. 2.4.0 ----- * added support for expressions in service definitions * added ContainerAwareTrait to add default container aware behavior to a class 2.2.0 ----- * added Extension::isConfigEnabled() to ease working with enableable configurations * added an Extension base class with sensible defaults to be used in conjunction with the Config component. * added PrependExtensionInterface (to be able to allow extensions to prepend application configuration settings for any Bundle) 2.1.0 ----- * added IntrospectableContainerInterface (to be able to check if a service has been initialized or not) * added ConfigurationExtensionInterface * added Definition::clearTag() * component exceptions that inherit base SPL classes are now used exclusively (this includes dumped containers) * [BC BREAK] fixed unescaping of class arguments, method ParameterBag::unescapeValue() was made public