我有一个服务,它从我的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。
谢谢!
答案 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)