【问题标题】:Inject parameter into Service Symfony 3.3将参数注入 Service Symfony 3.3
【发布时间】:2017-10-11 06:22:07
【问题描述】:

我有一个服务可以从我的 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,我也不知道为什么它会继续自动装配。

谢谢!

【问题讨论】:

  • 不知道为什么自动装配仍然有效,可能是缓存问题?但是您根本不需要将其关闭。您可以手动将参数作为命名参数传递。看symfony.com/doc/current/…
  • 因为您已将此问题标记为已解决,我们很想知道您是如何解决问题的

标签: symfony


【解决方案1】:

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

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

对不起,我之前没有看到它。

【讨论】:

    【解决方案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

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 谢谢,只是错过了文档的那一部分。谢谢!
      • 很好的评论,但它没有回答问题。这是评论,而不是答案
      • 如果他需要声明一个带有标量参数的服务,它应该在 autowire 声明 false ... 否?
      • 我不明白你最后的评论。如果你将 autowire 设置为 false,你就会失去自动装配的兴趣......
      • 这没有回答问题。
      猜你喜欢
      • 2017-12-05
      • 2018-03-02
      • 2017-06-03
      • 2017-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多