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


146

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

parameters:
    api_pass: apipass
    api_user: apiuser

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

$this->get('api_user');

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

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

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

답변:


296

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

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

문서 장에서 설명합니다.

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

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

$this->getParameter('api_user');

3
get컨트롤러 의 메소드도 컨테이너를 사용하지만 매개 변수가 아닌 컨테이너에서만 서비스를 가져올 수 있습니다. 당신은 필요한 getParameter매개 변수를 얻을 수 있습니다.
Wouter J

내가하려고하면 $this->getContainer()->getParameter('api_user');나는 치명적인 오류 : 정의되지 않은 메서드 ..Longpath에 전화 .. \ 컨트롤러 :: getContainer에 ().
Bohr

1
@Bohr 죄송합니다, 다른 버전의 Symfony2. 나는 내 대답을 편집 한 - 지금 확인)
Vitalii Zurian에게


Symfony 2.7 이상 : $this->hasParameter()아직 작동하지 않습니다.
Saman Mohamadi

23

깨끗한 길-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 ...)으로 업데이트되었습니다.)


이 주제에 대한 새로운 최소한의 방법 : tomasvotruba.cz/blog/2018/11/05/...
토마스 Votruba

10

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

parameters.yml

recipients: [email1, email2, email3]

서비스:

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

서비스 클래스 :

protected $recipients;

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

8

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 블로그를 참조하십시오 .


1
전체 매개 변수를 전달하는 것은 전체 컨테이너를 전달하는 것과 같습니다. "일부 서비스에 많은 컨테이너 매개 변수가 필요한 경우"(포스트에서 인용)
Tomáš Votruba

전체 매개 변수를 전달하면 성능에 문제가 있습니까?
ghazaleh javaheri 12

그 이유 중 하나이지만 대부분 가독성이 있습니다. 매개 변수 이름을 보면 다음 $meetupApiKey보다 약간 더 나은 것을 알 수 있습니다.$parameterBag
Tomáš Votruba


0

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');

4.8에서는 작동하지 않습니다. 언젠가 작동 했습니까?
Ricardo Martins

나는 이것에 대해 정말로 잊었다. 그러나 그것은 아마 내가 테스트 한 물건만을 게시했기 때문에 효과가 있었다!
Achraf JEDAY

1
죄송합니다, Acharaf. 잘 모르겠지만 컨트롤러에서 작동하지 않았습니다. 컨트롤러 내에서 DI없이 getParameter를 직접 호출 할 수 있습니다. 즉 : $this->getParameter('foo'). 그것이 SF 4.8에서 작동하게 만든 것입니다.
Ricardo Martins

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.