Slim 4 / PHP 8.2 upgrade

A keretrendszerünk PHP verzió lépéséhez egy "speciális" Slim 4-en alapuló keretet készítettünk. A projekt célja hogy a meglévő moduljaink a lehető legkisebb változtatással működjenek az új környezetben (PHP 8.2).
A Slim 4 alapelve az volt, hogy minden ami (szerintük) nem a keretrendszer része (Routing, DI container stb...) az kerüljön ki a csomagból és majd a user eldönti hogy mit akar használni.
A megoldás nagyrészt abból állt, hogy a korábbi implementációkat átemeltük a Slim4-es keretbe. Ilyen módon a DI container az betűre ugyan az maradt, ugyanúgy a központi Trait-en keresztül tudjátok elérni.
Másik célkitűzésük volt hogy a saját HTTP/Request és Response dolgaikat PSR-7 kompatibilis megoldásokra cserélték le, ami szép és jó, de a mi esetünkben voltak kellemetlen mellékhatások, pl. a PSR-7 Response nem ismeri a withJSON függvény, amit mi a API végpontoknál előszeretettel használunk. Erre egy külön csomagot csináltak, ami a PSR-7 Response-t "kidekorálja" és kiegészíti a megfelelő függvényekkel (slim/http csomag).

Átállás folyamata:

  • Nyiss egy új branch-et a masterből (Ne kérj composer installt)
  • Portainerben indítsd el a konténert
    • ** Másold be a referencia saml mappát (ez lehet majd kikerül, ha Johnny megálmodja a 2.0-s verziót), referencia a slim4-8 / master-ben
    • A saml/config/authsources.php-ban írd áz az entityID-t a sajátodra
    • A korábbi SimpleSAML_Logger::NOTICE class erre változott, a saml confiug.php-ban át kell írni SimpleSAML\Logger::DEBUG
  • Hozd át a settings.php-dat
  • Töröld le a comsposer.lock-ot, a composer.json require részét meg ürítsd ki
  • Composerrel telepítsd az alábbi függőségeket (lehet a konténeren belülről fog csak menni (ssh-docker PROJEKT-BRANCH), a külső composerrel PHP 8.2 alatt voltak gondok)
    • Alap csomagok: composer require slim/slim slim/psr7 slim/twig-view slim/http pimple/pimple simplesamlphp/simplesamlphp
    • Egyesével pakolgasd fel a projekthez kellő csomagokat, figyelj, mert a FaaZ/PDO-ból alapból a 2.0-t hozza, sok projekt viszont az 1.0-n van
  • Hozd át a core mappát a referencia projektből (slim4-8)
  • Módosítsd az index.php-t a public mappában a referencia projektnek megfelelően
  • A simplesaml vendorból szedd le a cert könyvtárat
  • A simplesaml 2.0 már másabb konfiggal megy, le kell választani a "régi" központi cuccról. Az app webapp.conf filejában a /simplesaml simlink-et állítsd a vendor-ban lévő simplesaml mappa public almappájára
  • Módosítsd a composer.json-t hogy a core mappát is töltse be, ne csak az app-ot (autoload szekció, psr-4), ha megvan akkor futtass egy composer dump-autoload-ot
  • Fésüld át a projektedet és a fenti változásokat vezesd át (route-ok, middleware-ek, dinamikus osztályok)
  • Teszteld a projekted, minden funkcionlitást, ha hibát látsz, log-ból túrd ki hogy mi az és javítsd (lib verzió ugrás is könnyedén okozhat hibát)


Változások:

Voltak olyan változások amiket nem lehetett / nagyon problémás lett volna áthidalni, ezek:

PHP 8 dinamikus osztály attribútumok

A Trait-nél és sok más helyen is használtuk ezt a megoldást, a példányosított objektumba olyan attribútumokat hoztunk létre ami nem szerepelt a osztály definícióban. Ez PHP 8-ban már nem működik sajnos. Ez volt:
Ez lett:

ALFI/Core

Ez a dinamikus attribútum dolog használva volt az ALFI/Core-ban is, így ebből készül egy 2.0-s változat, jelenleg ha ki akarjátok próbálni, akkor a composer fájlban a dev branch-et kell "kérni" (a dev- előtag jelzi hogy branch-et kérsz, a második dev a branch neve :)):


Routing group-olás

A Route fájlokban korábban az $app objektumon keresztül definiáltuk a bejegyzéseket és a groupokat is. Ezt kicsit átvariálták és bevezettek egy RouteCollectorProxy class-t
Ez volt:
Ez lett:

Route permission-ök

Amennyiben az alkalmazás használja a route permissionöket, az alábbi fájlokat/sorokat is módosítani kell.
Ez volt: Ez lett:
Továbbá a PermissionsMiddleware.php-ban kell módosítani az elábbi sorokat:
Erről: Erre:


pathFor metódus a router-ben és Twig-ben

A kiszervezési mánia sajnos a Router-t is érintette, eddig a konénerben volt egy router ami tudta a pathFor metódust. A pathFor az a routeParserben volt korábban is, ez volt kivezetve a routerbe mint "szolgálktatás", első körben a pathFor-t átnevezték urlFor-ra és nem vezették ki a routerbe.
A legegyszerűbb megoldás az volt hogy a route parser-t külön kitettem a konténerbe ahonnan bárhol el tudjátok érni.
Ez volt:
Ez lett:
Twig-ben ez volt:
Twig-ben ez lett:
Tömegs lecserélés a VSCode-ban: Ctrl + Shift + H


Middleware-ek

A middleware-eket kicsit átvariálták, korábban az __invoke megkapta a $next objektumot amivel továbblökhette a kérést illetve a DI konténerből le lehetett kérni a View-t amivel tetszőleges twig-et ki tudott renderelni (hiba oldalak).
Az új koncepcióban már egy Handler jön paraméterben, az egyedi hibaoldalak rendereléséhez a global $app-ból lehet kérni Response-t a funkción belül (ha szükséges Twig render miatt).
Ez volt:
Ez lett:

@ használata a kivételek elfedésére

A PHP 8.0-tól már nem "némítja" el a Fatal Error kategóriába eső dolgokat.

In PHP 8.0, the @ operator does not suppress certain types of errors that were silenced prior to PHP 8.0. This includes the following types of errors:
  • E_ERROR - Fatal run-time errors.
  • E_CORE_ERROR - Fatal errors occurred in PHP's initial startup.
  • E_COMPILE_ERROR - Fatal compile-time errors (from Zend engine).
  • E_USER_ERROR - User-triggered errors with trigger_error() function.
  • E_RECOVERABLE_ERROR - Catchable fatal error.
  • E_PARSE - Compile-time parse errors.
Ez már nem megy át hiba nélkül:

Action return bug

A beépülő könyvtárakat átszervezte a Slim, így állt elő egy bosszantó bug:


Cache bug

Hibalog: ErrorException: Only variables should be passed by reference


TwigView

A Twig integrációt is erősen érintette a frissítés, korábban volt egy gyári Twig Extension, ezt az új változatban már nem kell kézzel példányosítani.
A saját extensionban megváltoztak a névtér hivatkozások:
Ebből: new \Twig_SimpleFilter('number_afix',
Ez lett new \Twig\TwigFilter('number_afix',
Ugyanez érvényesült a Twig_SimpleFunction-nál, ő Twig\TwigFunction lett. A frissítés leginkább a konténerben lévő dolgokat kavarta meg, több beépülő függvény használt olyan függvényeket amik átkerültek máshova
(pl. pathFor, getBaseUrl). A végleges verió még tesztelés alatt van, itt majd érdemes lesz a System/View modult teljes egészében lecserélni a megadott frissített modulra.