Wprowadzenie (#0) – API w PHP z Laminas Mezzio

tytuł wpisu z grafiką kodu

Spis treści

  1. Szkielet aplikacji
  2. Uwierzytelnianie
  3. Komunikacja z MongoDB
  4. CRUD API
  5. Walidacja danych
  6. Obsługa błędów
  7. CORS

Cała seria będzie złożona z siedmiu artykułów. Naturalnie, wszystkie razem stanowią pewną całość i będą znajdowały się odwołania między nimi. Podział oraz narracja będą przygotowane w taki sposób, aby dało się niezależnie przeczytać każdy wpis, czy kawałek kodu – specjalnie dla tych, których interesuje konkretne zagadnienie.

Dla wygodniejszego przeglądania kodu, czy uruchomienia aplikacji, cały projekt można znaleźć w publicznym repozytorium github. Każdy krok to osobna gałąź oznaczona numerem wpisu (na przykład dla CRUD API będzie to step04). Najaktualniejsza wersja znajduje się zawsze na gałęzi master.

Opis aplikacji

Główne założenie i problem do rozwiązania: klienci organizacji mogą być pozyskiwani za pomocą różnych systemów. Istnieje potrzeba wymiany danych między systemami, po to by wszystkie miały dostęp do aktualnego stanu klientów. Należy więc stworzyć aplikację będącą centrum całej wymiany danych. Takie rozwiązanie pozwoli zapewnić spójność danych oraz uprości integracje między systemami. Każdy z nich będzie komunikował się tylko i wyłącznie z centralną bazą danych.

W związku z tym, jeśli w którymś systemie klient zostanie dodany, usunięty lub edytowany to taka informacja powinna również zostać odnotowana w głównej bazie klientów. Każda aplikacja ma też dostęp do listy wszystkich klientów oraz może podejrzeć konkretnego klienta za pomocą jego identyfikatora. Finalną wersją projektu będzie baza klientów z możliwością komunikacji przez uniwersalne API.

Technologie

Przede wszystkim PHP 8. Cała aplikacja powstanie w oparciu o microframework Laminas Mezzio bazujący na middleware. Dlaczego taki wybór? Jest to nowoczesne rozwiązanie zgodne ze standardami PSR. Dzięki ich przestrzeganiu może współpracować z wieloma niezależnymi komponentami. Spokojnie można stworzyć z jego pomocą większą aplikację, ale do tego celu niejednokrotnie lepiej sięgnąć po duże frameworki jak Laminas MVC czy Symfony. Mezzio natomiast świetnie nada się do mniejszych akcji jak: obsługa uwierzytelniania, autoryzacji, sesji, czy wreszcie API i mikroserwisów. Użycie tego microframeworka pozwala nawet postawić go obok aplikacji bazującej na innym rozwiązaniu i oddelegować mu jakieś konkretne zadanie. W tej serii jednak stworzona zostanie działającą niezależnie aplikacja.

Dodatkowo dane utrwalane będą w bazie NoSQL – MongoDB. Do komunikacji z bazą użyta zostanie Mongo PHP Library. Oczywiście z odpowiednią abstrakcją, po to by w razie czego można było w łatwiejszy sposób dokonać wymiany. Dla bardziej skomplikowanych aplikacji można rozważyć użycie Doctrine ODM, z którego korzysta się w analogiczny sposób jak Doctrine ORM. Tyle że bazuje się na dokumentach, a nie encjach. Co sprowadza się do tego, że trochę inaczej się je konfiguruje i buduje zapytania. Jednakże tylko operacji CRUD wystarczająca okaże się owa implementacja. A przy okazji pokazane zostanie jak tworzyć autonomiczne i reużywalne moduły.

Do tego wszystkiego dochodzi też kilka mniejszych komponentów, które będą komentowane w trakcie serii. W procesie developmentu przydadzą się też takie narzędzia jak:

  • phpunit i prophecy do testów;
  • php_codesniffer do automatycznego formatowania kodu zgodnie ze standardem PSR12;
  • docker do uruchomienia aplikacji (można użyć natywnie postawionego środowiska/xamppa czy co kto tam preferuje, natomiast będzie gotowa konfiguracja dla dockera).

Grupa docelowa

Nie wszystkie tematy będą dokładnie tłumaczone. Wiele z nich będzie tylko zahaczonych. Jeśli ktoś z Was czegoś nie rozumie – śmiało pytajcie w komentarzach. Analogicznie jeśli zauważycie błąd lub chcecie podyskutować na temat jakiegoś rozwiązania.

Będąc na obojętnie jakim poziomie, z tej serii można wyciągnąć coś dla siebie. Nie są to jednak wpisy dla totalnie początkujących programistów. Chociaż aplikacja będzie zwykłym prostym CRUD-em to nie będą tłumaczone zupełne podstawy, typu czym jest klasa.

Szczególnie skorzystają osoby, które mają już doświadczenie w programowaniu obiektowym i tworzeniu API, ale nie są jeszcze biegli w temacie. Albo Ci, którzy korzystają z innych frameworków, a są otwarci i chcą poznać inne rozwiązania. Laminas Mezzio w swoich założeniach jest podobny do frameworków Slim i Silex oraz rozwiązań z innych technologii jak Node.js, czy Ruby. Programiści, którzy z nich korzystają powinni poznać Mezzio!

Developerzy, którzy są zaawansowani w tworzeniu aplikacji webowych, ale nie znają podejścia middleware – jak najbardziej też mogą zacząć swoją przygodę od tej serii. Zresztą – sami jesteście w stanie ocenić, czy czegoś Was to nauczy i czy Was to interesuje.

Nauka

  • tworzenia JSON API w PHP,
  • microframeworka Laminas Mezzio,
  • standardów PSR7, PSR11 i PSR15,
  • bazy NoSQL MongoDB,
  • testów jednostkowych,
  • czystego kodu,
  • tworzenia modularnej i łatwo zarządzalnej aplikacji.

Motywacje

  1. Obecnie integracje to spora część pracy każdego programisty. Wystawianie API, czy komunikacja z API innych dostawców to codzienność. Trzeba to ogarniać. Stąd też z miłą chęcią podzielę się wiedzą, a i pewnie sam przy okazji też czegoś się nauczę.
  2. Laminas tworzy świetne i godne uwagi rozwiązania. Boli mnie ich niska popularność. Spokojnie mogą konkurować z Symfony, chociaż ten wygrywa właśnie ogromną społecznością i masą gotowych rozwiązań. Wiem, że temat może nie jest najpopularniejszy i wiele osób z chęcią zobaczyłoby kolejny kod przy użyciu Symfony, czy Laravel. Ale moim celem jest też lekka popularyzacja Laminasa. Poza tym na szczęście jeszcze mam ten przywilej, że mogą pisać o czym mam ochotę, a nie podążać za modą. A… i Symfony też jest niesamowite. Z Laravela, czy innych frameworków nie korzystałem to się nie wypowiadam.
  3. Laminas MVC znam dość dobrze, ale z Mezzio nie miałem zbyt dużo do czynienia. A do API nadaje się świetnie, więc czas to zmienić.
Krystian Żądło
Programista PHP i właściciel marki Koddlo. Pasjonat czystego kodu i dobrych praktyk programowania obiektowego. Prywatnie fan angielskiej piłki nożnej, dobrego humoru oraz podcastów.