컨트롤러에서 어플리케이션 파라미터에 액세스합니다(에 있는 파라미터)./app/config
)와 함께
$this->container->getParameter('my_param')
단, 서비스에서 접속하는 방법을 모릅니다(서비스 클래스가 연장되어서는 안 된다고 생각됩니다).SymfonyBundleFrameworkBundleControllerController
).
필요한 파라미터를 다음과 같이 서비스 등록에 매핑해야 합니까?
#src/Me/MyBundle/Service/my_service/service.yml parameters:
my_param1: %my_param1%
my_param2: %my_param2%
my_param3: %my_param3%
아님 비슷한 거?서비스에서 애플리케이션 파라미터에 어떻게 접근해야 합니까?
이 질문은 같은 것 같지만 실제로 답변한 것은 (컨트롤러의 파라미터) 서비스로부터의 액세스에 관한 것입니다.
질문에 대한 답변
서비스 정의에서 파라미터를 지정함으로써 다른 서비스를 주입하는 것과 동일한 방법으로 서비스에 파라미터를 전달할 수 있습니다.예를 들어 YAML의 경우:
services:
my_service:
class:
MyBundleServiceMyService
arguments: [%my_param1%, %my_param2%]
어디서%my_param1%
etc는 다음과 같은 이름의 파라미터에 대응합니다.my_param1
서비스 클래스 컨스트럭터는 다음과 같습니다.
public function __construct($myParam1, $myParam2) {
// ... }
더 클린웨이 2018
2018년 Symfony 3.4 이후로는 설정 및 사용이 간편한 훨씬 더 깔끔한 방법이 제공되었습니다.
컨테이너 및 서비스/파라미터 로케이터 안티 패턴을 사용하는 대신 생성자를 통해 클래스에 매개 변수를 전달할 수 있습니다.시간이 많이 걸리는 작업이 아니라 한 번 설정하고 잊어버리는 접근 방식이기 때문에 걱정하지 마세요.
어떻게 하면 2단계로 셋업 방법
1. config.yml
# config.yml parameters:
api_pass: 'secret_password'
api_user: 'my_name'
services:
_defaults:
autowire: true
bind:
$apiPass: '%api_pass%'
$apiUser: '%api_user%'
App:
resource: ..
2. 임의의Controller
<?php declare(strict_types=1);
final class ApiController extends SymfonyController {
/**
* @var string
*/
private $apiPass;
/**
* @var string
*/
private $apiUser;
public function __construct(string $apiPass, string $apiUser)
{
$this->apiPass = $apiPass;
$this->apiUser = $apiUser;
}
public function registerAction(): void
{
var_dump($this->apiPass); // "secret_password"
var_dump($this->apiUser); // "my_name"
} }
즉시 업그레이드 준비 완료!
이전 방식을 사용하는 경우 Rector를 사용하여 자동화할 수 있습니다.
더 읽기
이를 서비스 로케이터 접근법 위에 컨스트럭터 주입이라고 합니다.
이에 대한 자세한 내용은 Symfony Controller의 클린웨이에서 매개 변수를 얻는 방법을 참조하십시오.
(테스트가 완료되어 새로운 Symfony 메이저버전(5, 6…)의 갱신을 유지하고 있습니다).
symfony 4.1 이후 이를 달성할 수 있는 매우 깨끗한 새로운 방법이 있습니다.
<?php // src/Service/MessageGeneratorService.php
use SymfonyComponentDependencyInjectionParameterBagParameterBagInterface;
class MessageGeneratorService {
private $params;
public function __construct(ParameterBagInterface $params)
{
$this->params = $params;
}
public function someMethod()
{
$parameterValue = $this->params->get('parameter_name'); ...
} }
출처 : https://symfony.com/blog/new-in-symfony-4-1-getting-container-parameters-as-a-service.
필요한 매개 변수를 하나씩 매핑하는 대신 서비스가 컨테이너에 직접 액세스할 수 있도록 하는 것이 어떻습니까?이렇게 하면 (서비스와 관련된) 새로운 파라미터가 추가된 경우 매핑을 갱신할 필요가 없습니다.
그러기 위해서는:
서비스 클래스를 다음과 같이 변경합니다.
use SymfonyComponentDependencyInjectionContainerInterface; // <- Add this
class MyServiceClass {
private $container; // <- Add this
public function __construct(ContainerInterface $container) // <- Add this
{
$this->container = $container;
}
public function doSomething()
{
$this->container->getParameter('param_name_1'); // <- Access your param
} }
services.yml에서 @service_container를 “인수”로 추가합니다.
services:
my_service_id:
class: ...MyServiceClass
arguments: ["@service_container"]
// <- Add this
Symfony 4.1의 솔루션은 매우 간단합니다.
첫 번째 투고의 일부를 다음에 나타냅니다.
// src/Service/MessageGenerator.php // ...
use SymfonyComponentDependencyInjectionParameterBagParameterBagInterface;
class MessageGenerator {
private $params;
public function __construct(ParameterBagInterface $params)
{
$this->params = $params;
}
public function someMethod()
{
$parameterValue = $this->params->get('parameter_name');
// ...
} }
최초 투고 링크: https://symfony.com/blog/new-in-symfony-4-1-getting-container-parameters-as-a-service