* 4.4:
[Cache] fix cs
Make tests support phpunit 8
Allow Travis CI to build on PHP 7.4
[DI] Allow dumping the container in one file instead of many files
This PR was merged into the 4.3-dev branch.
Discussion
----------
[DI] Add an url EnvProcessor
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | no
| New feature? | yes
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | -
| License | MIT
| Doc PR | https://github.com/symfony/symfony-docs/pull/11128
This PR add a new env processor `url` to convert an URL (or DSN) into an array.
The main goal is to simplify the project configuration and reduce the number of env variable when working with bundle which are not able to deal with DSN
(pick some random project in symfony/recipes-contrib: https://github.com/symfony/recipes-contrib/blob/master/facile-it/mongodb-bundle/0.6/manifest.json or https://github.com/symfony/recipes-contrib/blob/master/wouterj/eloquent-bundle/1.0/manifest.json)
```yaml
# before
MONGODB_HOST=localhost
MONGODB_PORT=27017
MONGODB_USER=
MONGODB_PASSWORD=
MONGODB_DB=symfony
mongo_db_bundle:
data_collection: '%kernel.debug%'
clients:
default:
hosts:
- { host: '%env(MONGODB_HOST)%', port: '%env(int:MONGODB_PORT)%' }
username: '%env(MONGODB_USER)%'
password: '%env(MONGODB_PASSWORD)%'
connectTimeoutMS: 3000
connections:
default:
database_name: '%env(MONGODB_DB)%'
# after
MONGODB_DSN=mongodb://localhost:27017/symfony
mongo_db_bundle:
data_collection: '%kernel.debug%'
clients:
default:
hosts:
- { host: '%env(key:host:url:MONGODB_DSN)%', port: '%env(key:port:url:MONGODB_DSN)%' }
username: '%env(key:user:url:MONGODB_DSN)%'
password: '%env(key:pass:url:MONGODB_DSN)%'
connectTimeoutMS: 3000
connections:
default:
database_name: '%env(key:path:url:MONGODB_DSN)%'
```
Added also a `query_string` processor to parse query string
```
DATABASE_DSN=mysql://localhost/db?charset=utf8
foo:
bar:
charset: '%env(key:charset:query_string🔑query:url:DATABASE_DSN)%'
```
Commits
-------
f253c9b7ca Add an url EnvProcessor
This PR was merged into the 4.3-dev branch.
Discussion
----------
[DependencyInjection] Add ability to define an index for service in an injected service locator argument
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | no
| New feature? | yes
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | n/a
| License | MIT
| Doc PR | in progress / symfony/symfony-docs#...
It's more or less the same thing then the PR #30257 but for a service locator argument
Add a simple way to specify an index based on a tag attribute to simplify retrieving a specific service when injecting a service locator as argument into services, but also a way to fallback to a static method on the service class.
Yaml:
```yaml
services:
foo_service:
class: Foo
tags:
- {name: foo_tag, key: foo_service}
foo_service_tagged:
class: Bar
arguments:
- !tagged_locator
tag: 'foo_tag'
index_by: 'key'
default_index_method: 'static_method'
```
XML:
```xml
<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/serviceshttp://symfony.com/schema/dic/services/services-1.0.xsd">
<services>
<service id="foo" class="Foo">
<tag name="foo_tag" key="foo_service" />
</service>
<service id="foo_tagged_iterator" class="Bar" public="true">
<argument type="tagged_locator" tag="foo_tag" index-by="key" default-index-method="static_method" />
</service>
</services>
</container>
```
PHP:
```php
// config/services.php
use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
$container->register(Foo::class)
->addTag('foo_tag', ['key' => 'foo_service']);
$container->register(App\Handler\HandlerCollection::class)
// inject all services tagged with app.handler as first argument
->addArgument(new ServiceLocatorArgument(new TaggedIteratorArgument('app.handler', 'key')));
```
Usage:
```php
// src/Handler/HandlerCollection.php
namespace App\Handler;
use Symfony\Component\DependencyInjection\ServiceLocator;
class HandlerCollection
{
public function __construct(ServiceLocator $serviceLocator)
{
$foo = $serviceLocator->get('foo_service'):
}
}
```
Tasks
* [x] Support PHP loader/dumper
* [x] Support YAML loader/dumper
* [x] Support XML loader/dumper (and update XSD too)
* [x] Add tests
* [x] Documentation
Commits
-------
cb3c56bc0c Support indexing tagged locators by FQCN as fallback
250a2c8332 [DI] Allow tagged_locator tag to be used as an argument
This PR was merged into the 4.3-dev branch.
Discussion
----------
Nullable environment variable processor
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | no
| New feature? | yes
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets |
| License | MIT
| Doc PR | todo
Hey there,
Because environment variables are strings by design, empty environment variables are evaluated to `""` by default.
In the same way, `MY_ENV_VAR=null` will be evaluated to `"null"`, as a string.
What I suggest is to allow some environment variables to be evaluated to `null` (the real one) when their strings are _blank_ or equal _null_, _Null_ or _NULL_.
This can be easily done through a new `nullable` processor:
```bash
# .env
API_KEY=
```
```yaml
# config/services.yaml
services:
FooService:
arguments:
$apiKey: %env(nullable:API_KEY)%
```
```php
# src/Services/FooService
namespace App\Services;
final class FooService
{
/**
* @var string|null
*/
private $apiKey;
/**
* FooService constructor.
*/
public function __construct(?string $apiKey)
{
$this->apiKey = $apiKey;
}
public function doSomething()
{
// Free plan
if (null === $this->apiKey) {
// ...
}
}
}
```
That's an example that comes to my mind but there can be many others.
This can also help in using null coalesce operators in constructors instead of checking if a string equals `""` (which is very PHP4 style).
Of course it can be used in conjunction with other types, i.e. `%env(float:nullable:SOME_OPTIONAL_FLOAT_ENV_VAR)%`.
What do you think?
Commits
-------
3a604ac392 Nullable environment variable processor
* 3.4:
[DI] Turn services and aliases private by default, with BC layer
[WebProfiler] Fix z-index for pinned AJAX block
Require v3.4+ of the var-dumper component
* 3.4:
Do not display short exception trace for built-in console exceptions
Deprecated the web_profiler.position option
[DI] rename ResolveDefinitionTemplatesPass to ResolveChildDefinitionsPass
Throw a meaningful exception when an undefined user provider is used inside a firewall
[DI] Allow processing env vars
This PR was merged into the 3.4 branch.
Discussion
----------
[DI] rename ResolveDefinitionTemplatesPass to ResolveChildDefinitionsPass
| Q | A
| ------------- | ---
| Branch? | 3.4
| Bug fix? | no
| New feature? | no
| BC breaks? | no
| Deprecations? | yes
| Tests pass? | yes
| Fixed tickets | -
| License | MIT
| Doc PR | -
Because that name makes things harder to understand now.
This uses exactly the same BC layer logic as the one we have for the renaming of DefinitionDecorator to ChildDefinition.
Commits
-------
a7f98c60d9 [DI] rename ResolveDefinitionTemplatesPass to ResolveChildDefinitionsPass