Laminas: MVC Framework for PHP – Book Review

Laminas: MVC Framework for PHP – Book Review

Selenium Testing Tools Cookbook - Book Cover
Guest post written by: Wojtek Marczak.
Put aside any PHP framework with MVC architecture which you used to work with just for a little moment and make a room for new pretender to the crown. Start to expect more from your framework, put less effort to do the same things as you used to before. How, you would ask? Ladies and gentleman, I present to you the Laminas MVC, the chosen one in web frameworks for the new 2020 era!

Pages 464
Publication Date 8th May 2020
Target Audience Intermediate
Author Adam Omelak
Category PHP, MVC framework, microservices

Covered Subjects

5/5

Let’s start this section with: this book isn’t for everyone. There is a good reason why it says: “Level: Intermediate” on the back cover.
So what does that really mean in terms of covered aspects of Laminas MVC? Well it means that book can less focus on learning a reader about PHP general concepts and the purpose of having a framework, and more on introducing crucial MVC aspects of Lamians and their true practical usage.

We have a whole spectrum of most vital components to be used in every MVC application. Starting from: getting to know core concepts like Event Manager, Service Manage, Configs and ending at Administration Panel with roles and Content Management System.

Writing Style

5/5

In its original version of “Zend Framework 3: Developer’s Guide” the book had quite a few errors, styling issues, wrong formatting and even grammar mistakes. Thankfully 2019 update has improved its quality. “Laminas: MVC Framework for PHP” because it’s based on ZF book is far more polished and checked.

The examples are batter explained and the previous gaps have been filled with comments, insights and even suggestion on how to extend and modify them.

Examples

4/5

Every single code used to create a functionality is printed in the book. This means that the reader can write as you read a working examples without a need for downloading a single chapters code. Which BTW can be viewed and cloned from GitHub repository.

It doesn’t matter that few chunks of code are not explained to the bottom because for most of there we can find additional comments in sample code chapters anyway.

Summary

4.5/5

It takes more than couple of months to usually write a single book, but this position has been written and improved for almost 3 years. A complete summary of what Laminas MVC can and will do with ease is on of the best starting resource to learn Laminas world for any developer who is open for new technology.

Give it a try and you might be surprised! (I am not just saying this because I used to work with Adam – the author of this book. This is my honest opinion).

Book reviewed by Wojtek Marczak.

Where to buy?

Laminas: MVC Framework for PHP - Book coverBuy Laminas: MVC Framework for PHP Book on Amazon

Rate this artcile
[Total: 8 Average: 4.6]
Please follow and like us:

19 thoughts on “Laminas: MVC Framework for PHP – Book Review

    • Yes, the book covers Laminas API Tools, in fact it covers full chapter for it. Unfortunately Mezzio is not in the scope of this paper.

  1. Cześć! Kupiłem książkę z niemieckiego amazona. Stosowałem się do kodu z książki, jako przykładu. Mam jednak jeden problem z sesją. Po dłuższym czasie nieaktywności, po odświeżeniu strony wyrzuca mi błąd: Application/src/Module.php w funkcji bootstrapSession($e) i problem dotyczy $session->start();

    Jak mogę to rozwiązać?

    i jeszcze zapisując sesję do katalogu .data/session/ z opcjami w pliku global.php
    ‘session’ => [
    ‘config’ => [
    ‘class’ => \Laminas\Session\Config\SessionConfig::class,
    ‘options’ => [
    ‘name’ => ‘session_www’,
    ‘cookie_httponly’ => true,
    ‘cookie_secure’ => true,
    ‘cookie_path’ => ‘/’,
    ‘cookie_domain’ => ‘domena’,
    ‘cookie_lifetime’ => xxx,
    ‘gc_maxlifetime’ => xxx,
    ‘save_path’ => APPLICATION_PATH .’/data/sessions’,
    ],
    ],
    ‘storage’ => \Laminas\Session\Storage\SessionArrayStorage::class,
    ‘validators’ => [
    \Laminas\Session\Validator\RemoteAddr::class,
    \Laminas\Session\Validator\HttpUserAgent::class,
    ],
    ]
    : przestaje działać csrf przy każdym formularzu.

    Jeśli będzie Pan pisał kolejny tego typu podręcznik (o Laminasie) to mam kilka uwag na temat tego co dodać, a powinno to pomóc każdemu, kto kupi książkę. Na swoim przykładzie mogę wskazać kilka rzeczy, które powinny zostać dodane, aby czytelnik miał lepszy obraz frameworka.

    Pozdrawiam!

    • Witam,

      Rzeczywiście w kodzie jest błąd, który pojawi się dopiero po wygaśnięciu sesji.

      Prostym sposobem na naprawienie całego tego błędu jest dodanie bloku try..catch tak jak poniżej:

      public function bootstrapSession($e)
      {
      $serviceManager = $e->getApplication()->getServiceManager();
      $session = $serviceManager->get(SessionManager::class);

      try {
      $session->start();
      $container = new Session\Container('initialized');
      } catch (\Laminas\Session\Exception\RuntimeException $e) {
      //session has expired
      return;
      }

  2. Witam!

    1. Szkoda, że w książce brakuje przykładu z uploadem plików – może tutaj na blogu jakiś przykładowy kod do analizy lub na githubie.
    2. Ciekaw jestem także co Pan sądzi o DDD? W Pana książce brak tego modelu, czy to oznacza, że Pan nie poleca go?

    Pozdrawiam

    • 1. Całkiem dobry pomysł do dodania jako HOW-TO, narazie skupiam się na Laminas Starter Kit, zapewne tam zostanie dodane nowe narzędzie. Dzięki za sugestie 🙂

      2. DDD to podejście do programowania, niż użycie danego framework’a do pracy. Przyjmuję DDD jako bardziej abstrakcyjny poziom programowania (czyli wyżej niż sam framework). Tak naprawdę DDD uprawiał każdy inny architekt, ale w różnym stopniu. Niestety mało jest ludzi, którzy rzeczywiście mają możliwość zaprojektowania tak dużego projektu od początku z dowolnością co do użycia technologi. Zazwyczaj jest to podyktowane narzędziami, które już istnieją i funkcjonują w danej firmie. Stąd też większość ludzi piszących o DDD niestety nie ma wymaganego doświadczenia do populizmu tego tematu.

  3. Witam,

    czy mógłbym prosić Pana, jako eksperta Laminasa, o przykładowy kod:
    1. Jak przekazywać zmienną językową do funkcji (jako parametr ? ) czy też istnieje lepszy sposób?
    2. Przykład listenera- taki z życia wzięty z Pana projektów, jak wyczytałem z opisu w książce np. z platformy e-learningowej 🙂
    3. W Pana książce w przykładach sesji są trzymane wszystkie dane użytkownika – łącznie z hasłem etc. Jak można to ograniczyć do kilku pól z bazy danych, aby na wszelki wypadek takich danych tam nie było.

    P.S. Świetna książka Panie Adamie. Poproszę o część drugą z bardziej zaawansowanymi przykładami. Brakuje kontynuacji.

    Pozdrawiam i trzymam kciuki za projekt!

    • 1. Najlepiej wszystkie zależności wstrzykiwać po przez Dependency Injection, czyli przez konstruktor klasy.
      2. Mamy kilka takich listener’ów, niestety kodu z firmy nie mogę upubliczniać z powodu licencji. Przykładowy listener to na przykład tworzenie cache dla quizów podczas ich tworzenia (wraz z raportami) oraz synchronizacja cache przy edycji takiego quizu. Dzięki temu nie ważne z jakiego miejsca na stronie zmodyfikujemy quiz, nasz cache będzie zawsze zsynchronizowany.
      3. Oczywiście, ze można ograniczyć ilość danych, wystarczy zwrócić wyszczególnione atrybuty zamiast całego obiektu w metodzie: getIdentityArray() w klasie: Utils\Security\Authentication.

      Część druga będzie w głównej mierze zależała od popularności samego Laminas’a 🙂

  4. Panie Adamie mam też pytanie takie teoretyczne. Skalowalność aplikacji napisanej w Laminasie a serwery chmurowe. Jak podejść do tematu?

    • Jeśli chodzi o zarządzanie i skalowalność to polecam Zend Server, nie jestem tylko pewien, czy wspiera on już Laminas’a.

  5. Przykład wdrożenia CSP w Laminasie? Wszędzie tego szukam. Zwłaszcza jak przekazać wygenerowany atrybut nonce do pliku doładowywanego funkcją load jquery (plik ma w kontrolerze użyte setTerminal(true), ale rozumiem, że to nowe żądanie HTTP i nowo wygenerowane nonce które jest różne od tego z oryginalnego headera). Dałbym Pan radę udostępnić przykładowy kod z opisem?

    • Można to zrobić na 2 sposoby.
      1. Stworzyć nowy View Helper i podpiąć go jako listener do renderowania templatki: https://docs.laminas.dev/laminas-view/cookbook/setting-module-specific-layouts/ .
      2. Zmodyfikować metodę: setEventManager() w AbstractController.php dodając wygenerowany token.

  6. Można to zrobić na 2 sposoby.
    1. Stworzyć nowy View Helper i podpiąć go jako listener do renderowania templatki: https://docs.laminas.dev/laminas-view/cookbook/setting-module-specific-layouts/ .
    2. Zmodyfikować metodę: setEventManager() w AbstractController.php dodając wygenerowany token.

    Skorzystałem z drugiej metody i dodałem generowanie csp nonce atrybutu do metody setEventManager() w AbstractController.php, ale to nie rozwiązuje problemu w doładowywanym pliku funkcją load(); W templatce powiedzmy index.phtml (indexAction controller) mam atrybut nonce = 123, ale jak wywołam po kliknięciu w atrybut doładowywany plik powiedzmy modal.phtml to ten atrybut jest już inny niż na index.phtml powiedzmy 124 (odwołanie w modal.phtml przez $this->layout()->getVariable(‘csp_att’)) i skrypt w templatce modal.phtml (modalAction controller) się nie wykonuje. Mamy tutaj doczytywanie z innej akcji controllera. Przekazywanie poprzez parametr routingu nie jest bezpieczne, jakims pomysłem jest zmienna sesyjna, ale nie wiem jak to rozwiązać. Mógłbym liczyć na wskazówkę?

  7. Good way of explaining, and good piece of writing to obtain facts on the topic of my presentation topic, which i am going to convey in academy.

  8. Cześć Adam,

    w pliku /module/Application/src/Module.php

    brakuje obsługi walidacji sesji i obsługi wyjątku w przypadku session hijacking. zgdnie z dokumentacją laminasa należy dodać w metodzie onBootstrap:

    $eventManager = $e->getApplication()->getEventManager();
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);

    i na górze pliku odpowiednie use ….

    Pozdrawiam,
    KK

Leave a Comment