Symfony 3,DI - 将服务添加到参数

12

我有这段代码

services:
  repo.game:
    class: Doctrine\ORM\EntityRepository
    factory_service: doctrine.orm.default_entity_manager
    factory_method: getRepository
    arguments:
        - AppBundle\Entity\Game

  file.upload.listener:
    class: AppBundle\Listener\FileUploadListener
    arguments: [@repo.game]
    tags:
        - { name: "kernel.event_listener", event: "oneup_uploader.post_upload", method: "onUpload" }

在 2.8 及以下版本中这个方法运行良好,但是在 3.0 版本中我遇到了如下错误信息:

[Symfony\Component\DependencyInjection\Exception\InvalidArgumentException] The file "/ext/thing/app/config/services.yml" does not contain valid YAML.

[Symfony\Component\Yaml\Exception\ParseException] The reserved indicator "@" cannot start a plain scalar; you need to quote the scalar at line 14 (near "arguments: [@repo.game]").

/ext/thing/app/config/services.yml 文件中没有其他内容。


它在2.8中被弃用并在3.0中被移除(https://github.com/symfony/symfony/blob/2.8/src/Symfony/Component/Yaml/Inline.php#L239-L245)。只需像这样引用您的服务 arguments: ['@repo.game'],它就应该通过。 - qooplmao
2
对于双引号/单引号的情况... "在我看来,使用单引号比双引号更容易:在Yaml中,双引号需要转义字符串中的许多字符,而单引号只需要转义单引号本身(通过将它们加倍)"(摘自https://github.com/symfony/symfony-demo/issues/246#issuecomment-157686459) - qooplmao
1
一旦您解决了@符号的问题,您可能会遇到有关factory_service的错误。您需要使用factory,http://symfony.com/doc/current/components/dependency_injection/factories.html - Cerad
@Cerad 謝謝 - 是的,你是對的 ;-) - 現在一切都正常運行了。 - Martin-
3个回答

17

参考yaml部分的UPGRADE指南:

以@、`、|或>开头的未引用字符串会导致ParseException。

因此,请按照以下方式修改配置:

 file.upload.listener:
    class: AppBundle\Listener\FileUploadListener
    arguments: ["@repo.game"]
    tags:
        - { name: "kernel.event_listener", event: "oneup_uploader.post_upload", method: "onUpload" }
希望这有所帮助。

谢谢,我相当确定在2.8中没有收到任何弃用错误,这就是为什么我“认为”我可以安全升级的原因。 - Martin-
花了一个小时盯着我的配置文件,谢谢!现在开始阅读升级指南的其余部分... :) - Joe

1

第一个错误看起来像是缩进问题,你的参数和标签中有2个缩进空格和4个缩进空格,请尝试在线测试yml。

第二个错误是symfony 3现在很严格。您需要在服务参数[@repo.game]中添加引号,变为["@repo.game"]


0

目前,带有特殊字符的值必须使用单引号而不是双引号进行包装。这是有效的yaml,但例如,在symfony上运行phpunit时会抛出许多异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接