Thanks to visit codestin.com
Credit goes to github.com

Skip to content

[DependencyInjection] Add ability to define an index for service in an injected service locator argument #30348

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Mar 15, 2019

Conversation

XuruDragon
Copy link

@XuruDragon XuruDragon commented Feb 22, 2019

Q A
Branch? master
Bug fix? no
New feature? yes
BC breaks? no
Deprecations? no
Tests pass? yes
Fixed tickets #29203
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:

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 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/services
    http://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:

// 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:

// 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

  • Support PHP loader/dumper
  • Support YAML loader/dumper
  • Support XML loader/dumper (and update XSD too)
  • Add tests
  • Documentation

@XuruDragon XuruDragon changed the title [DI] Allow tagged_locator tag to be used as an argument [DependencyInjection] Add ability to define an index for an injected service locator argument Feb 22, 2019
@XuruDragon XuruDragon changed the title [DependencyInjection] Add ability to define an index for an injected service locator argument [DependencyInjection] Add ability to define an index for service in an injected service locator argument Feb 22, 2019
Copy link
Member

@nicolas-grekas nicolas-grekas left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(once @stof's comment is addressed)

@vudaltsov
Copy link
Contributor

Is there any possibility to index by a class name?

@nicolas-grekas
Copy link
Member

@vudaltsov sure: implement getDefautKeyName and make it return self::class.

@vudaltsov
Copy link
Contributor

That will be a new static method in the interface which all tagged services implement...
What if we could add such a possibility out of the box? It's quite common to index by a class name. Because it's automatically a unique identifier and a key that is easy to use in the code.

@nicolas-grekas
Copy link
Member

nicolas-grekas commented Feb 28, 2019

@vudaltsov then make all such classes extends some base class, and make the method of that class return static::class. That's almost what is done right now for form types.

@vudaltsov
Copy link
Contributor

@XuruDragon , what about default_index_method: '::class'?

@nicolas-grekas
Copy link
Member

@vudaltsov thanks for facts checking :) Indexing by FQCN is now implemented as a fallback when the attribute or the method are either not defined in the tag or not found on the service.

@XuruDragon
Copy link
Author

branch has been rebase on up-to-date master

@nicolas-grekas
Copy link
Member

Thank you @XuruDragon.

@nicolas-grekas nicolas-grekas merged commit cb3c56b into symfony:master Mar 15, 2019
nicolas-grekas added a commit that referenced this pull request Mar 15, 2019
…or service in an injected service locator argument (XuruDragon, nicolas-grekas)

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/services
    http://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
-------

cb3c56b Support indexing tagged locators by FQCN as fallback
250a2c8 [DI] Allow tagged_locator tag to be used as an argument
@nicolas-grekas nicolas-grekas modified the milestones: next, 4.3 Apr 30, 2019
@fabpot fabpot mentioned this pull request May 9, 2019
javiereguiluz added a commit to symfony/symfony-docs that referenced this pull request Sep 24, 2019
…or service locators (Anthony MARTIN)

This PR was submitted for the master branch but it was merged into the 4.3 branch instead (closes #11042).

Discussion
----------

[DependencyInjection] Doc for Allow to choose an index for service locators

Here is the doc for the new feature implemented in : [symfony/symfony#30348](symfony/symfony#30348) that follow the feature [symfony/symfony#30257](symfony/symfony#30257)

Commits
-------

d63c298 [DependencyInjection] Doc for Allow to choose an index for service locator collection
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants