繁体   English   中英

symfony 4.1:不存在此类服务

[英]symfony 4.1: no such service exists

所以我上周创建了一个新的 Symfony 4.1 项目,并且一直在努力工作,没有任何问题。 直到昨天我开始使用一些第三方依赖项。 我使用composer require guzzlehttp/guzzle guzzle 安装了 Guzzle 客户端。 据我所知,这安装了 package 就好了。

但是,当我尝试将此服务注入代码(事件或命令)中的构造函数时,我收到错误消息: Cannot autowire service "App\xxx\Command\testCommand": argument "$client" of method "__construct()" references class "GuzzleHttp\Client" but no such service exists.

Guzzle 服务不是唯一不起作用的服务,这只是一个示例。 对我来说奇怪的是,有很多依赖项都可以正常工作,例如 Doctrine DocumentManager、JMS 序列化程序和 NelmioApiDocBundle。

到目前为止我尝试过的(实际上是半解决问题)是将服务名称添加到我的 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.
        public: false       # Allows optimizing the container by removing unused services; this also means
                        # fetching services directly from the container via $container->get() won't work.
                        # The best practice is to be explicit about your dependencies anyway.   

    GuzzleHttp\Client:  <-- Adding this makes it work flawlessly.

这个解决方案的问题是我最终会在我的 services.yaml 文件中添加数百个服务,只是为了让它们工作。 在我看来,这不是最佳解决方案。

所以我的问题是如何以最优雅的方式解决这个问题。 这是我在我的项目中做错了什么吗? 这是必须在供应商方面解决的问题吗? 如果是这样,如何使它与 Symfony 4.1 一起使用?

composer require GuzzleHttp\Client

似乎您正在尝试需要 class,而不是 package。 我不知道作曲家足够聪明,可以通过它提供的类识别 package,所以我检查了......它不能,只给出 package 名称建议。

确保您了解什么是作曲家 package。

Guzzle 服务不是唯一不起作用的服务,这只是一个示例。

您没有 Guzzle 服务。 你只有 guzzle 库和它的类。 服务需要一个服务定义,就像你写的那样。

您提到的 Doctrine 等其他服务正在运行,因为它们是提供服务定义的捆绑包。

要么使用捆绑软件,要么使用库,然后自己连接。

在 guzzle 的情况下,我不会使用捆绑包。 再说一次,我不会再直接使用 guzzle,而是使用 HTTPlug。 (捆绑: https://github.com/php-http/HttplugBundle ,库: https://github.com/php-http/httplug

就我而言,我只需要重新生成优化的自动加载文件。

所以使用composer dump-autoload为我解决了这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM