Получить сервис из контейнера внутри метода контроллера в Symfony 5 - PullRequest
0 голосов
/ 25 апреля 2020

Я постепенно портирую некоторый код с Symfony 2 на Symfony 5. Мне нужно иметь возможность получить сервис из контейнера внутри метода контроллера. В методе сервис не вводится так, как рекомендовано в Symfony 5. Я хочу сделать это только для того, чтобы позволить мне сейчас двигаться дальше, адаптироваться к Symfony 5 и позже использовать автопроводку.

Вот мой config / services.yaml:

services:
    # default configuration for services in *this* file
    _defaults:
        autowire: true      # Automatically injects dependencies in your services.
        autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.

    # makes classes in src/ available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    App\:
        resource: '../src/*'
        exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'

    # controllers are imported separately to make sure services can be injected
    # as action arguments even if you don't extend any base controller class
    App\Controller\:
        resource: '../src/Controller'
        tags: ['controller.service_arguments']

    # add more service definitions when explicit configuration is needed
    # please note that last definitions always *replace* previous ones

    App\EventListener\ExceptionListener:
        tags:
            - { name: kernel.event_listener, event: kernel.exception }


    Mybdl\Generator\MessageGenerator:

    numbergenerator:
        class: Mybdl\Generator\NumberGenerator

У меня есть 2 класса Mybdl \ Generator \ MessageGenerator и Mybdl \ Generator \ NumberGenerator, которые не подключены автоматически, и настроили их вручную в config / services.yaml выше.

Как вы можете видеть в методе индекса контроллера ниже, Mybdl \ Generator \ MessageGenerator был успешно введен в метод (Symfony 5 способ), и мне интересно, что мне не хватает если есть возможность получить услугу «Генератор чисел» из контейнера. Вот контроллер:

<?php
namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Mybdl\Generator\MessageGenerator;

class DefaultController extends AbstractController {


    function index(MessageGenerator $messageGenerator) {
        $message = $messageGenerator->getHappyMessage();
        $numberGenerator = $this->container->get('numbergenerator');
        return new Response(
            '<html><body>Lucky message: '.$message.'</body></html>'
        );
    }

}

А вот ошибка, которая у меня есть:

Service "numbergenerator" not found: even though it exists in the app's container, the container inside "App\Controller\DefaultController" is a smaller service locator that only knows about the "doctrine", "form.factory", "http_kernel", "parameter_bag", "request_stack", "router", "security.authorization_checker", "security.csrf.token_manager", "security.token_storage", "serializer", "session" and "twig" services. Try using dependency injection instead.

Спасибо

1 Ответ

0 голосов
/ 25 апреля 2020

измените файл config / services.yaml на

    numbergenerator:
        class: Mybdl\Generator\NumberGenerator
        public: true

, и инъекция будет работать.

Но ... лучше оставить его закрытым и добавить его в контроллер действие, как было предложено @ Cerad

...