1

我正在从 symofony 2.7 迁移到 symfony 4.0。成功地我迁移了一个包。现在我正在迁移第二个捆绑包,并且出现错误消息。我完全没有得到 symfony 4.0 想要从我这里得到的东西。

如果我打开autowire: true此错误消息将出现。

Cannot autowire service "App\Kernel": argument "$environment" of method "Symfony\Component\HttpKernel\Kernel::__construct()" must have a type-hint or be given a value explicitly.

有人可以帮助我吗?

如果我将其关闭,则不会出现任何消​​息。

更新

我只在 bundles.php 中注册了我的包

App\Backend\AccountBundle\BackendAccountBundle::class => ['all' => true],
4

1 回答 1

10

通常,内核作为所谓的合成服务添加到服务容器中,这意味着它不是由 DI 容器从配置中生成的。而是设置 id,然后将先前配置的服务添加到容器中。您的包的容器想要在这里创建一个新内核似乎很奇怪。所以我会检查你想在哪里以及如何访问任何捆绑服务中的内核,以及你是否真的想传入内核而不是其他东西。如果您这样做,您可能需要查看合成服务的服务容器文档。

至于错误本身。当您有需要像内核这样的参数的服务时,Symfony 的自动装配通常会失败:

public function __construct(string $environment, bool $debug) {...}

在这些情况下,您必须在其中定义一个services.yaml与参数名称匹配的参数:

# config/services.yaml
parameters:
    environment: prod
    debug: false

或者你必须告诉配置你想在那些地方有哪些参数。

App\Kernel:
    $environment: prod
    $debug: false

这将告诉自动装配只有 2 个名为environment并且debug应该用您提供的值覆盖的参数,但其余的都是通过自动装配完成的。这样你可以跳过arguments:定义的一部分,你也可以跳过所有你知道通过自动装配正确设置的参数。

例如,如果您有这样的服务:

class MyService {
    public function __construct(OtherServce $service, string $someParameter) {}
}

# config/services.yaml

services:
    _defaults:
        autowiring: true

    MyService:
        $someParameter: 'someValue'

这与显式编写相同:

services:
    MyService:
        class: MyService
        arguments:
            - '@OtherServce'
            - 'someValue'
于 2017-12-29T10:23:56.410 回答