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 $connectionParameters, string $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:
$queue: events
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.
Lesezeichen