Symfony2'deki bir denetleyicideki parameters.yml'den nasıl okuyabilirim?


148

App / config / parameters.yml dosyama birkaç özel değişken koydum.

parameters:
    api_pass: apipass
    api_user: apiuser

Bunlara denetleyicimden erişmem gerekiyor ve bunları almaya çalıştım

$this->get('api_user');

denetleyici dosyamın içinden. Bunu denediğimde şu hata mesajını alıyorum:

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

Bunu yapmanın doğru yolu nedir?

Yanıtlar:


298

In Symfony 2.6 ve daha eski sürümleri sonra ilk konteyner almalısınız ve - -, bir denetleyici içinde bir parametre almak için gerekli parametre.

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

Bu belge bölümü bunu açıklamaktadır.

Birlikte $this->get()bir kontrol yöntemi bir hizmet (yükleyecektir doc )

In Symfony 2.7 ve daha yeni sürümleri , aşağıdaki kullanabileceğiniz bir denetleyici bir parametreyi almak için:

$this->getParameter('api_user');

3
Not getdenetleyici yöntem de kabı kullanır, ancak yalnızca bir kap değil, parametreler gelen hizmet alabilirsiniz. İhtiyacınız getParameterparametreleri alır.
Wouter J

Denediğimde $this->getContainer()->getParameter('api_user');Fatal hata alıyorum: Tanımlanmamış yönteme çağrı .. Uzunpath .. \ Controller :: getContainer ().
Bohr

1
@Bohr üzgünüm, Symfony2'nin farklı versiyonu. Cevabımı düzenledim - şimdi kontrol et;)
Vitalii Zurian


Symfony 2.7 ve daha yenisi: $this->hasParameter()henüz çalışmıyor.
Saman Muhammed

24

Temiz Yol - 2018+, Symfony 3.4+

2017 ve Symfony 3.3 + 3.4'ten beri çok daha temiz bir yol var - kurulumu ve kullanımı kolay.

Kap ve servis / parametre konumlandırıcı anti-modelini kullanmak yerine, parametreleri yapıcısı aracılığıyla sınıfa geçirebilirsiniz . Endişelenmeyin, zaman alıcı bir iş değil, bir kez kurun ve unutun yaklaşımı .

2 adımda nasıl kurulur?

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. Herhangi 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"
    }
}

Anında Yükseltmeye Hazır!

Daha eski bir yaklaşım kullanmanız durumunda, şunları yapabilirsiniz: Rektör ile otomatikleştirebilirsiniz .

Daha fazla oku

Bu denir hizmet bulucu üzerinden yapıcı ekleme yaklaşımı .

Bununla ilgili daha fazlasını okumak için gönderimi kontrol edin için Symfony Controller'da Parametre Nasıl Temiz Şekilde Elde Edilir .

(Test edildi ve yeni Symfony ana sürümü için güncel tutuyorum (5, 6 ...)).


Bu konuyla ilgili yeni minimalist yol: tomasvotruba.cz/blog/2018/11/05/…
Tomáš

11

Size swiftmailer ile bir örnek gönderiyorum:

parameters.yml

recipients: [email1, email2, email3]

Hizmetler:

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

hizmetin sınıfı:

protected $recipients;

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

8

Symfony 4'te şunları kullanabilirsiniz 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');
        // ...
    }
}

ve içinde app/config/services.yaml:

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

Benim için hem denetleyici hem de form sınıflarında çalışıyor. Daha fazla ayrıntı Symfony blogunda bulunabilir .


1
Tüm parametreler çantasını geçmek, bütün bir kabı geçmek gibidir. Yalnızca "belirli bir hizmet çok sayıda kapsayıcı parametresine ihtiyaç duyuyorsa" mantıklıdır (
gönderiden

yani, performans sorununa neden olan tüm parametrenin geçmesini mi kastediyorsunuz?
ghazaleh javaheri

Bu sebeplerden biri, ancak çoğunlukla okunabilirlik için. Parametre adını görürsem, $meetupApiKeyneyi beklemem gerektiğini biraz daha iyi biliyorum$parameterBag
Tomáš Votruba


0

Symfony 4.3.1'de bunu kullanıyorum:

services.yaml

HTTP_USERNAME: 'admin'
HTTP_PASSWORD: 'password123'

FrontController.php

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

4.8'de çalışmıyor. Bir gün işe yaradığına emin misin?
Ricardo Martins

Bunu gerçekten unuttum ama evet muhtemelen işe yaradı çünkü sadece test edilmiş şeyler gönderdim!
Achraf JEDAY

1
Üzgünüm Acharaf. Bilmiyorum ama kontrol cihazımda çalışmadı. Denetleyicinizin içinde, DI olmadan doğrudan getParameter'ı çağırabilirsiniz. Yani: $this->getParameter('foo'). SF 4.8'de çalışmasını sağlamak için bunu yaptım.
Ricardo Martins

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.