2017-10-11 87 views
1

我有一個服務,從我的parameters.yml注入字符串值。注入參數到服務Symfony 3.3

我聲明如下服務,以便:

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。

謝謝!

+1

不知道爲什麼自動裝配仍處於活動狀態可能是緩存問題?但你根本不需要關掉它。您可以手動傳遞參數作爲命名參數。看看https://symfony.com/doc/current/service_container.html#manually-wiring-arguments – Joe

+0

因爲你已經標記了這個問題已解決,我們很想知道你是如何解決你的問題的 – Arno

回答

2

AppBundle\Security\AccessTokenGenerator服務將自動載入autowire: true本聲明:

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

您可以覆蓋任何通過使用其id(類nam e)低於

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