将参数注入Service Symfony 3.3

时间:2017-10-11 06:22:08

标签: symfony

我有一个服务,它从我的parameters.yml中注入字符串值。

我宣布这样的服务:

parameters:
    url: '%cms_url%'
    client_id: '%cms_client_id%'
    client_secret: '%cms_client_secret%'

services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false

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

    api:
        class: AppBundle\Service\Api
        arguments: ['@session', '%cms_url%']
        autowire: false

    access_token_generator:
        class: AppBundle\Security\AccessTokenGenerator    
        arguments: [cms_url, cms_client_id, cms_client_secret]
        autowire: false

当我运行应用程序时,AccessTokenGenerator会抛出错误说:

  

无法自动装配服务参数$ apiUrl必须具有typehint或给定   价值直接。

这是我的AccessTokenGenrator类:

class AccessTokenGenerator
{
    private $apiUrl;

    private $clientId;
    private $clientSecret;

    public function __construct(string $apiUrl, string $clientId, string $clientSecret)
    {
        $this->apiUrl = $apiUrl;
        $this->clientId = $clientId;
        $this->clientSecret = $clientSecret;
    }

    public function generateAccessToken(string $username, string $password) : ?AccessToken
    {
        $queryParams = [
            'client_id'     => $this->clientId,
            'client_secret' => $this->clientSecret,
            'grant_type'    => 'password',
            'username'      => $username,
            'password'      => $password
        ];
        $requestUrl = $this->apiUrl . '/oauth/v2/token?' . http_build_query($queryParams);

        $client = new Client();
        $request = new Request('GET', $requestUrl);
        $response = $client->send($request);

        $contents = json_decode($response->getBody()->getContents(), true);

        if (isset($contents['access_token'])) {
            $accessToken = new AccessToken();
            $accessToken->setAccessToken($contents['access_token']);
            $accessToken->setExpiresIn($contents['expires_in']);
            $accessToken->setTokenType($contents['token_type']);
            $accessToken->setScope($contents['scope']);
            $accessToken->setRefreshToken($contents['refresh_token']);

            return $accessToken;
        }
    }
}

我不知道为什么它会进行自动装配,即使我的配置设置为false。

谢谢!

3 个答案:

答案 0 :(得分:2)

AppBundle\Security\AccessTokenGenerator服务将通过此声明自动加载autowire: true

AppBundle\:
        resource: '../../src/AppBundle/*'

您可以使用

下面的ID(类名)覆盖导入的任何服务
AppBundle\Security\AccessTokenGenerator:
    arguments: ['%cms_url%', '%cms_client_id%', '%cms_client_secret%']

警告,您忘记了参数的百分比'%'。 如果您需要access_token_generator服务,可以创建别名:

access_token_generator: '@AppBundle\Security\AccessTokenGenerator'

最终文件可能是:

services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false

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

    api: '@AppBundle\Service\Api'
    AppBundle\Service\Api:
        arguments: {$apiUrl: '%cms_url%'}

    access_token_generator: '@AppBundle\Security\AccessTokenGenerator'
    AppBundle\Security\AccessTokenGenerator:
        arguments: ['%cms_url%', '%cms_client_id%', '%cms_client_secret%']

Documentation : manually wiring arguments

Documentation : explicitly configuring services and arguments

答案 1 :(得分:2)

@Arno是对的,如果你指定了exaclty的参数名称,你可以自动装备一个标量。

https://symfony.com/doc/current/service_container.html#service-parameters

抱歉,我之前没有看到它。

答案 2 :(得分:1)

相关问题