【发布时间】: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