无法在Symfony 3.3中将参数传递给服务

时间:2017-10-11 10:15:51

标签: php symfony

我在Symfony 3.3的服务中使用了一个参数,但我一直收到错误。

错误

  

[Symfony的\元器件\ DependencyInjection \异常\ AutowiringFailedException]     无法自动服务" AppBundle \ Service \ ApiInterface":参数" $ api_endpoint"方法" __ construct()"必须有一个类型提示或明确给出一个值。

config.yml

services:
app.security.login_form_authenticator:
    class: AppBundle\Security\LoginFormAuthenticator
    autowire: true
    arguments: ['@doctrine.orm.entity_manager']
app.service.api_interface:
    class: AppBundle\Service\ApiInterface
    arguments:
      $api_endpoint: "%endpoint test%"

_defaults:
    autowire: true
    autoconfigure: true
    public: false

AppBundle\:
    resource: '../../src/AppBundle/*'
    exclude: '../../src/AppBundle/{Entity,Repository,Tests}'

AppBundle\Controller\:
    resource: '../../src/AppBundle/Controller'
    public: true
    tags: ['controller.service_arguments']

ApiInterface.php

use Unirest;

class ApiInterface
{

private $api_endpoint;

public function __construct(string $api_endpoint)
{
    $this->timeout = 1;

    echo 'form apiinterface construct: ' . $api_endpoint;

}

感谢任何帮助,我觉得我应该在一个简单的工作中绕圈子去!

1 个答案:

答案 0 :(得分:4)

问题是您有两种不同的服务:app.service.api_interfaceAppBundle\Service\ApiInterface。第一个是好配置,第二个不是。

如果您一定需要app.service.api_interface服务,可以更改配置,以便将第一个作为第二个的别名,如下所示:

app.service.api_interface: '@AppBundle\Service\ApiInterface'
AppBundle\Service\ApiInterface:
    arguments:
        $api_endpoint: "%endpoint test%"

使用您的配置,您不需要配置AppBundle\Service\ApiInterface服务,但可以配置app.service.api_interface服务。 根据我的建议,您可以配置2个服务。

如果您不需要app.service.api_interface服务,则只能提供一项服务:

AppBundle\Service\ApiInterface:
    arguments:
        $api_endpoint: "%endpoint test%" 

此声明会覆盖AppBundle\Service\ApiInterface服务。 您可以使用下面的ID(类名称)覆盖导入的任何服务:最好将此覆盖移到AppBundle\声明下方。

最终文件可以是这样的:

#app/config/services.yml
services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false

    AppBundle\:
        resource: '../../src/AppBundle/*'
        exclude: '../../src/AppBundle/{Entity,Repository,Tests}'

    AppBundle\Controller\:
        resource: '../../src/AppBundle/Controller'
        public: true
        tags: ['controller.service_arguments']

    app.security.login_form_authenticator: '@AppBundle\Security\LoginFormAuthenticator'
        # autowire: true #Optional, already set in _defaults
        # arguments: ['@doctrine.orm.entity_manager'] # Optional because of autowiring

    app.service.api_interface: '@AppBundle\Service\ApiInterface' 
    AppBundle\Service\ApiInterface:
        arguments:
            $api_endpoint: "%endpoint test%"

Documentation : manually wiring arguments

Documentation : explicitly configuring services and arguments

此外,我建议您删除参数名称%endpoint test%的空格(例如将其重命名为%endpoint_test%