Wzorce projektowe – CQRS (Command Query Responsibility Segregation)

Założenie: Zrozumieć podstawy wzorca projektowego CQRS w PHP poprzez prosty przykład.

Krok po kroku:

  1. Definicja interfejsów: Stworzymy dwa interfejsy: jeden dla komend (operacje modyfikujące) i drugi dla zapytań (operacje pobierające).
  2. 
    interface Command {
      public function execute();
    }
    
    interface Query {
      public function execute(): mixed;
    }
    				

    Te interfejsy definiują kontrakty dla naszych klas komend i zapytań.

  3. Implementacja komendy: Stworzymy klasę implementującą interfejs Command, która będzie dodawać użytkownika do bazy danych (symulacja).
  4. 
    class AddUserCommand implements Command {
      private string $name;
    
      public function __construct(string $name) {
        $this->name = $name;
      }
    
      public function execute(): void {
        // Symulacja dodania użytkownika do bazy danych
        echo "Dodano użytkownika: " . $this->name . "\n";
      }
    }
    				

    Klasa AddUserCommand przyjmuje imię użytkownika i symuluje dodanie go do bazy danych.

  5. Implementacja zapytania: Stworzymy klasę implementującą interfejs Query, która będzie zwracać listę użytkowników (symulacja).
  6. 
    class GetUsersQuery implements Query {
      public function execute(): array {
        // Symulacja pobierania użytkowników z bazy danych
        return ["Jan", "Anna", "Piotr"];
      }
    }
    				

    Klasa GetUsersQuery symuluje pobranie listy użytkowników.

  7. Wywołanie komendy i zapytania: Wywołujemy komendę i zapytanie.
  8. 
    $command = new AddUserCommand("Maria");
    $command->execute();
    
    $query = new GetUsersQuery();
    $users = $query->execute();
    print_r($users);
    				

    Ten kod pokazuje, jak wywołać komendę i zapytanie. Każda operacja jest wyraźnie oddzielona.

Ten przykład prezentuje podstawowe założenia wzorca CQRS. Zachęcamy do dalszego zgłębiania tematu i poznawania bardziej zaawansowanych zastosowań tego wzorca.

Dodaj komentarz 0

Your email address will not be published. Required fields are marked *