Symfony 无法自动连线服务“;X";:“论点”$param";“方法”的定义__构造();是“hi”型吗;字符串“;,您应该显式地配置它的值

Symfony 无法自动连线服务“;X";:“论点”$param";“方法”的定义__构造();是“hi”型吗;字符串“;,您应该显式地配置它的值,symfony,autowired,Symfony,Autowired,我有一个具有此构造函数的类: public function __construct(string $username, string $database, string $password, string $host) { $this->username = $username; $this->database = $database; $this->password = $password; $

我有一个具有此构造函数的类:

    public function __construct(string $username, string $database, string $password, string $host)
    {
        $this->username = $username;
        $this->database = $database;
        $this->password = $password;
        $this->host = $host;
    }
在我的服务配置文件中,我添加了:

App\DataFixtures\Migration\Database\DatabaseConnector:
      arguments:
          $username: '%env(USERNAME_PROD)%'
          $password: '%env(PASSWORD_PROD)%'
          $database: '%env(DATABASE_PROD)%'
          $host: '%env(HOST_PROD)%'
我已经尝试禁用和启用自动配置和自动布线,但没有解决问题


我的配置文件真的被加载了。

这是因为symfony的自动连接。当您将字符串作为服务的参数注入,然后使用自动连线时,Symfony不知道要注入哪个字符串

您可以禁用指定服务的自动连接。请注意,在services.yaml文件中,您排除了用于自动布线的服务文件或文件夹

例如,在我的例子中,我添加了以下行:

exclude: '../src/DataFixtures/Migration/*'
您应该显式地配置它的值

。。。可能在构造函数方法内部,而不是将其作为参数传递。 看看

如果数据库凭据已存储在.env中,则可以直接从类的构造函数中访问:

public function __construct()
{
    $this->username = $_ENV['USERNAME_PROD'];
    $this->database = $_ENV['DATABASE_PROD'];
    $this->password = $_ENV['PASSWORD_PROD'];
    $this->host = $_ENV['HOST_PROD'];
}

根据他们所做的并不是特别错误。不,不,不。不适合Symfony。@Cerad如果你能告诉我为什么不,我就把它拿走。鉴于Dotenv组件文档,这看起来是一个可行的解决方案。@Jakumi,我不明白,我不是想说有人做错了。您正在查看将Dotenv用作独立组件的文档。Symfony框架试图抽象超全局变量,比如$\u请求、$\u会话,甚至$\u ENV。该框架还大力鼓励依赖注入。最后,还有一些正在进行的容器处理,在某些情况下会将配置文件中的内容转换为其他内容。总而言之,虽然使用$_ENV可能会起作用,但最好在Symfony应用程序中使用Symfony方式。您的错误消息与发布的代码不一致。错误与$param有关,而您发布的代码显示其他参数。我看到您的回答是排除它,这很好,因为我怀疑您自己从未直接使用过该服务。