Ergebnis 1 bis 2 von 2

Thema: Symfony config arguments

  1. #1
    Jayster
    Gast

    Standard Symfony config arguments

    Mal wieder eine Frage an die Symfony Experten hier.

    Ich habe folgendes Szenario. Meine Applikation muss Messages von einer RabbitMQ verarbeiten. Im dev-Environment benutze ich den offiziellen Docker Container mit einem Host. Auf dem Test- und Live-Server habe ich ein Cluster mit mehreren Hosts. Daher verwende ich nicht die Symfony Messenger Komponente, sondern die php-amqplib Bibliothek (https://packagist.org/packages/php-amqplib/php-amqplib), die ich schon in ein paar nicht-Symfony-Projekten verwendet habe. Diese kann mit mehreren Hosts umgehen: https://github.com/php-amqplib/php-a...ts-connections.

    Lokal habe ich also einen Host. Auf dem Server gibt es mehrere Host, die nach dem gleichen Muster aufgebaut sind: rabbit01.host.de, rabbit02.host.de, rabbit03.host.de ...

    Ich erstelle mir also eine Klasse, die die php-qmqplib Bibliothek verwenden wird. Momentan sieht sie folgendermaßen aus:
    PHP-Code:
    class RabbitMqClient
    {
        public function 
    __construct(array $connectionParametersstring $queue)
        {
            
    dump($connectionParameters);
            
    dump($queue);
        }

    In meiner services.yaml injecte ich die $connectionParameters basierend auf den Umgebungsvariablen. Die Umgebungsvariablen, die nicht in allen Environments gesetzt werden, werden dabei mit dem Default Wert null initialisiert.
    PHP-Code:
    parameters:
        
    env(RABBITMQ_HOST): null
        env
    (RABBITMQ_HOST_COUNT): null
        env
    (RABBITMQ_HOST_PATTERN): null

    services
    :
        
    App\Client\RabbitMqClient:
            
    arguments:
                
    $connectionParameters:
                    
    host'%env(resolve:RABBITMQ_HOST)%'
                    
    host_count'%env(resolve:RABBITMQ_HOST_COUNT)%'
                    
    host_pattern'%env(resolve:RABBITMQ_HOST_PATTERN)%'
                    
    user'%env(resolve:RABBITMQ_USER)%'
                    
    password'%env(resolve:RABBITMQ_PASSWORD)%' 
    Meine lokalen Umgebungsvariablen setze ich so, dass ich nur einen Host angebe:
    Code:
    RABBITMQ_HOST=host
    RABBITMQ_USER=user
    RABBITMQ_PASSWORD=password
    Auf dem Test- und Live-Server gebe ich stattdessen die Host Anzahl und das Muster an:
    Code:
    RABBITMQ_HOST_COUNT=3
    RABBITMQ_HOST_PATTERN=rabbit%s.host.de
    RABBITMQ_USER=user
    RABBITMQ_PASSWORD=password
    So kann ich dann in der Klasse RabbitMqClient je nachdem ob "host" oder "host_pattern" gesetzt ist entweder einen Verbindung zu einem Host oder zu einem Cluster aus mehreren Hosts aufbauen.

    Meine erste Frage dazu ist, ob das der beste Weg ist. Ich habe noch nicht so viel Erfahrung mit der Symfony Konfiguration.

    Die zweite Frage ist, wie ich am besten $queue injecte. Die soll basierend auf dem Service, der den RabbitMqClient verwendet, gesetzt werden. Zum Beispiel möchte ich in der Kommando-Klasse "ConsumeEventsCommand" die queue "events" verwenden. Ich habe dazu folgenden naiven Ansatz versucht, der aber nicht funktioniert hat:

    PHP-Code:
    services:
        
    App\Command\ConsumeEventsCommand:
            
    arguments:
                
    App\Client\RabbitMqClient:
                    
    arguments:
                        
    $queueevents 
    Gibt es einen Weg, das elegant zu lösen? Mir würde nur einfallen, dem RabbitMqClient eine setQueue-Methode zu geben und dann dem ConsumeEventsCommand einen Parameter $queue zu injizieren, der dann mit setQueue gesetzt wird. Schöner wäre aber, die queue direkt in den Konstruktor zu injizieren.
    Geändert von Jayster (29.03.2019 um 16:00 Uhr)

  2. #2
    Jayster
    Gast

    Standard

    Ich habe eine Lösung gefunden.

    Zum einen brauche ich die Unterscheidung zwischen Single Host und Multiple Host bei den Umgebungsvariablen nicht wirklich. Wenn ich nur einen Host habe, kann ich bei HOST_COUNT einfach 1 eintragen und bei HOST_PATTERN den entsprechenden Host ohne Platzhalter %s.

    Meine Environment Variablen schauen nun also so aus:

    Lokal:
    Code:
    RABBITMQ_HOST_COUNT=1
    RABBITMQ_HOST_PATTERN=my-host.de
    RABBITMQ_USER=user
    RABBITMQ_PASSWORD=password
    Server:
    Code:
    RABBITMQ_HOST_COUNT=3
    RABBITMQ_HOST_PATTERN=rabbit%s.host.de
    RABBITMQ_USER=user
    RABBITMQ_PASSWORD=password
    Zum anderen habe ich dank der Symfony Dokumentation (https://symfony.com/doc/current/serv...-and-arguments) rausgefunden, wie ich meine Services konfigurieren kann. Hier die services.yaml
    Code:
    parameters:
        rabbit_mq_connection:
            host_count: '%env(int:RABBITMQ_HOST_COUNT)%'
            host_pattern: '%env(resolve:RABBITMQ_HOST_PATTERN)%'
            user: '%env(resolve:RABBITMQ_USER)%'
            password: '%env(resolve:RABBITMQ_PASSWORD)%'
    
    services:
        rabbit_mq_client.events:
            class: App\Client\RabbitMqClient
            arguments:
                $connectionParameters: '%rabbit_mq_connection%'
                $queue: events
    
        App\Command\ConsumeEventsCommand:
            arguments:
                App\Client\RabbitMqClient: '@rabbit_mq_client.events'
    Ich definiere also einen Service pro Queue (im Beispiel "events") und nutze den dann, wo er gebraucht wird (im Beispiel ConsumeEventsCommand).

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •