[symfony] symfony2의 컨트롤러에서 parameters.yml을 어떻게 읽습니까?

내 app / config / parameters.yml에 몇 가지 사용자 정의 변수를 넣었습니다.

parameters:
    api_pass: apipass
    api_user: apiuser

내 컨트롤러에서 이것에 액세스해야하며

$this->get('api_user');

내 컨트롤러 파일 내에서. 이것을 시도하면 다음과 같은 오류 메시지가 나타납니다.

You have requested a non-existent service "api_user".

이를 수행하는 올바른 방법은 무엇입니까?



답변

에서 심포니 2.6 및 이전 버전 당신이 먼저 용기를 얻을해야하고, – -, 컨트롤러에 매개 변수를 얻기 위해 필요한 매개 변수를.

$this->container->getParameter('api_user');

문서 장에서 설명합니다.

$this->get()컨트롤러의 메소드가 서비스를로드하는 동안 ( doc )

에서 심포니 2.7 이상 버전 , 다음을 사용할 수있는 컨트롤러에 매개 변수를 얻을 수 있습니다 :

$this->getParameter('api_user');


답변

깨끗한 길-2018+, Symfony 3.4+

2017 및 Symfony 3.3 + 3.4 부터 설정 및 사용이 훨씬 더 깔끔한 방법이 있습니다.

컨테이너 및 서비스 / 매개 변수 로케이터 안티 패턴을 사용하는 대신 생성자를 통해 클래스에 매개 변수를 전달할 수 있습니다 . 걱정하지 마십시오. 시간이 많이 걸리는 작업이 아니라 한 번 설정하고 접근 방식을 잊어 버립니다 .

2 단계로 설정하는 방법은 무엇입니까?

1. app/config/services.yml

# 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 …)으로 업데이트되었습니다.)


답변

나는 당신에게 swiftmailer와 함께 예제를 보냅니다 :

parameters.yml

recipients: [email1, email2, email3]

서비스:

your_service_name:
        class: your_namespace
        arguments: ["%recipients%"]

서비스 클래스 :

protected $recipients;

public function __construct($recipients)
{
    $this->recipients = $recipients;
}


답변

Symfony 4에서는 다음을 사용할 수 있습니다 ParameterBagInterface.

use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;

class MessageGenerator
{
    private $params;

    public function __construct(ParameterBagInterface $params)
    {
        $this->params = $params;
    }

    public function someMethod()
    {
        $parameterValue = $this->params->get('parameter_name');
        // ...
    }
}

그리고 app/config/services.yaml:

parameters:
    locale: 'en'
    dir: '%kernel.project_dir%'

컨트롤러 및 폼 클래스 모두에서 작동합니다. 자세한 내용은 Symfony 블로그를 참조하십시오 .


답변

당신이 사용할 수있는:

public function indexAction()
{
   dump( $this->getParameter('api_user'));
}

자세한 내용은 doc을 읽는 것이 좋습니다.

http://symfony.com/doc/2.8/service_container/parameters.html


답변

Symfony 4.3.1에서는 다음을 사용합니다.

services.yaml

HTTP_USERNAME: 'admin'
HTTP_PASSWORD: 'password123'

FrontController.php

$username = $this->container->getParameter('HTTP_USERNAME');
$password = $this->container->getParameter('HTTP_PASSWORD');


답변

다음을 사용할 수도 있습니다.

$container->getParameter('api_user');

http://symfony.com/doc/current/service_container/parameters.html 방문