Я постепенно портирую некоторый код с 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.
Спасибо