我在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;
}
感谢任何帮助,我觉得我应该在一个简单的工作中绕圈子去!
答案 0 :(得分:4)
问题是您有两种不同的服务:app.service.api_interface
和AppBundle\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%
)