Symfony - как правильно выбрать интерфейс (type-hint) для служб Symfony? - PullRequest
0 голосов
/ 14 декабря 2018

Я часто борюсь с тем, чтобы угадать правильный интерфейс для включения службы.Например, это рекомендуемый способ получить маршрутизатор.

use Symfony\Component\Routing\Generator\UrlGeneratorInterface;

class SomeService
{
    private $router;

    public function __construct(UrlGeneratorInterface $router)
    {
        $this->router = $router;
    }
}

Я думаю, что я получаю здесь "vendor \ symfony \ routing \ Router.php".Но класс Router реализует RouterInterface, RequestMatcherInterface.Не UrlGeneratorInterface!

Я не понимаю логику, стоящую за этим.Спасибо за любую помощь.

1 Ответ

0 голосов
/ 15 декабря 2018

https://symfony.com/doc/current/service_container/autowiring.html#working-with-interfaces

Практика заключается в создании псевдонима интерфейса, который вы вводите, для класса, который вы хотите внедрить.Поэтому, если вы хотите, чтобы вводился класс, отличный от Router, в services.yml do:

// services.yml
services:
    App\Util\Router: ~

    Symfony\Component\Routing\Generator\UrlGeneratorInterface: '@App\Util\Router'

Пока существует только один класс, реализующий интерфейс, и этот класс является частьюконфигурирование псевдонима в одном и том же пространстве имен не является обязательным, и Symfony автоматически создаст его.

Почему ваш случай работает?Наследование.

https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Routing/RouterInterface.php

interface RouterInterface extends UrlMatcherInterface, UrlGeneratorInterface

...