it-swarm.com.de

Wie lese ich von parameters.yml in einem Controller in symfony2?

Ich habe ein paar benutzerdefinierte Variablen in meine app/config/parameters.yml eingefügt.

parameters:
    api_pass: apipass
    api_user: apiuser

Ich muss auf diese von meinem Controller aus zugreifen und habe versucht, sie mit abzurufen

$this->get('api_user');

aus meiner Controller-Datei. Wenn ich das versuche, erhalte ich folgende Fehlermeldung:

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

Was ist der richtige Weg, dies zu tun?

133
Bohr

Um in Symfony 2.6 und älteren Versionen einen Parameter in einem Controller abzurufen, sollten Sie zuerst den Container und dann den erforderlichen Parameter erhalten.

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

Dieses Dokumentationskapitel erklärt es.

Während die $this->get()-Methode in einem Controller einen Dienst lädt ( doc )

In Symfony 2.7 und neueren Versionen können Sie zum Abrufen eines Parameters in einer Steuerung Folgendes verwenden:

$this->getParameter('api_user');
280
Vitalii Zurian

Der saubere Weg

Seit 2017 und Symfony 3.3 + 3.4 gibt es einen viel saubereren Weg - einfach einzurichten und zu verwenden.

Anstatt Anti-Pattern für Container und Service/Parameter-Locator zu verwenden, können Sie die Parameter über den Konstruktor an die Klasse übergeben. Keine Sorge, es ist keine zeitaufwendige Arbeit, sondern einmal einrichten und vergessen.

Wie kann ich es in 2 Schritten einrichten?

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

Sofortiges Upgrade fertig!

Falls Sie einen älteren Ansatz verwenden, können Sie mit Rector automatisieren.

Weiterlesen

Dies wird als Konstruktor-Injektion über Services locator bezeichnet.

Weitere Informationen hierzu finden Sie in meinem Beitrag So erhalten Sie Parameter in Symfony Controller auf saubere Weise .

(Es wurde getestet und ich halte es für die neue Hauptversion von Symfony (5, 6 ...).).

16
Tomáš Votruba

Ich sende Ihnen ein Beispiel mit swiftmailer:

parameter.yml

recipients: [email1, email2, email3]

dienstleistungen:

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

die Klasse des Dienstes:

protected $recipients;

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

In Symfony 4 können Sie die ParameterBagInterface verwenden:

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');
        // ...
    }
}

und in app/config/services.yaml:

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

Es funktioniert für mich in Controller- und Formularklassen. Weitere Details finden Sie im Symfony-Blog .

1

In Symfony 4.3.1 verwende ich Folgendes:

services.yaml

HTTP_USERNAME: 'admin'
HTTP_PASSWORD: 'password123'

FrontController.php

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

Sie können verwenden:

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

Für weitere Informationen empfehle ich Ihnen, das Dokument zu lesen:

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

0
mrDjouk