2017-10-11 5 views
1

私のparameters.ymlからの文字列値を注入するサービスがあります。サービスへのパラメータの入力Symfony 3.3

私はそうのようなサービスを宣言:

は、サービスの引数$ apiUrlをautowireすることはできません直接typehintまたは与えられた 値を持っている必要があります。私はそれがAccessTokenGeneratorはというエラーをスローアプリが実行したとき

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 

。私はそれも私の設定がfalseに設定されているオートワイヤリングに進み、なぜ知らない

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; 
     } 
    } 
} 

は、これは私のAccessTokenGenratorクラスです。

ありがとうございます!

+1

autowiringがまだキャッシュの問題の可能性がある理由を知りませんか?しかし、あなたはそれをまったくオフにする必要はありません。名前付き引数として手動でパラメータを渡すことができます。 https://symfony.com/doc/current/service_container.html#manually-wiring-arguments – Joe

+0

この問題を解決済みとマークしたので、問題をどのように解決したかがわかりました – Arno

答えて

1

あなただけ

AppBundle\Security\AccessTokenGeneratorサービスが自動的にこの宣言によってautowire: trueがロードされているマニュアル

https://symfony.com/doc/current/service_container/autowiring.html#fixing-non-autowireable-arguments

+0

ありがとう、ちょうどそれを逃したドキュメントの一部。ありがとう! – iamjc015

+1

良いコメントですが、質問には答えません。コメントであり、答えではありません – Arno

+0

スカラー引数を持つサービスを宣言する必要がある場合は、autowire falseで宣言する必要があります...いいえ? – Mocrates

2

を参照オブジェクトのスカラーパラメータをautowireすることはできません。

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

あなたがいずれかをオーバーライドすることができますそのID(クラス名)を使用してインポートされたサービスe)以下

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

警告、引数のパーセント '%'は忘れてしまっています。あなたがaccess_token_generatorサービスが必要な場合は、エイリアスを作成することができ :

access_token_generator: '@AppBundle\Security\AccessTokenGenerator' 

最終的なファイルは次のようになります。あなたがautowireできる

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

関連する問題