Symfony 4.4如何在没有自动布线的情况下配置控制器

Symfony 4.4如何在没有自动布线的情况下配置控制器,symfony,dependency-injection,Symfony,Dependency Injection,我需要将服务注入控制器构造函数方法 服务中心 imports: - { resource: controllers.yaml } services: _defaults: autowire: false autoconfigure: false public: false App\: resource: '../src/*' exclude: '../src/{Application/M

我需要将服务注入控制器构造函数方法

服务中心

imports:
    - { resource: controllers.yaml }

services:
    _defaults:
        autowire: false
        autoconfigure: false 
        public: false

    App\:
        resource: '../src/*'
        exclude: '../src/{Application/Message,Infrastructure/Repository/MySql/Migrations,Tests,Kernel.php}'
A.yaml

    app.controller:
        class: App\UI\Controller\AppController
        arguments:
            - '@monolog.logger.api'
        tags: ['controller.service_arguments']

    app.controller.keyword:
        class: App\UI\Controller\BlogController
        arguments:
            - '@monolog.logger.api'
        tags: ['controller.service_arguments']
BlogController.php

class BlogController extends AbstractController
{
    private $logger;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    public function postForSubscribers(Request $request, FindPostQuery $query): JsonResponse
    {
        $page = $request->query->get('page') ?? 1;
        $limit = $request->query->get('limit') ?? 500;
        $daysBack = $request->query->get('days-back') ?? '7';
        try {
            $results = $query->getResults($daysBack, new Paging((int)$page, (int)$limit));
            return new JsonResponse($results->normalize());
        } catch (Exception $e) {
            $this->logger->warning($e->getMessage(), [
                'line' => $e->getLine(),
                'file' => $e->getFile(),
                'trace' => $e->getTraceAsString(),
            ]);
            return new JsonResponse(['error' => 'Something broken, cant fetch post data.'], 500);
        }
    }
}
操作
postForSubscribers
return
URI“/api/v1/post/subscribers”的控制器不可调用。无法从容器中获取控制器“App\UI\Controller\BlogController”,因为它是私有的。您是否忘记用“controller.service\u arguments”标记服务?

但是controllers.yaml包含控制器标签,我应该如何配置控制器? 有人能帮忙吗

当我添加到service.yaml时,请注意:

App\UI\Controller\:
        resource: '../src/UI/Controller'
        tags: ['controller.service_arguments']

我得到:
函数App\UI\Controller\BlogController的参数太少::\uu construct(),在第13行的/var/www/html/var/cache/dev/ContainerV9lwkz0/getBlogControllerService.php中传递了0,正好是预期的1个

,因为我看到您没有从默认配置中排除控制器,请在此处添加排除项:

exclude: '../src/{Application/Message,Infrastructure/Repository/MySql/Migrations,Tests,Kernel.php}'
这不是必需的,但这可能会覆盖您的手动配置。(这取决于哪个是第一位)

然后,关注
autowire
参数,如果此参数为false,则必须使用
参数手动注入依赖项
-请参阅和


祝你好运

首先,需要在每个service.yaml文件中复制_defaults部分。可能还有其他问题。不幸的是,我还有8个不同的导入yaml文件
命令
查询
存储库
等。除控制器外的所有功能都很完美。在原始controllers.yaml文件中,将“app.controller”id替换为控制器类名并设置为public:true。以及将您的控制器从您的默认services.yaml中排除,如下所述。在脱离主题时,如果您确实有那么多文件,则将自己设置为config/services目录,并在Kernel.php中添加一行以加载该目录中的任何文件。无需导入。