Milyen újításokat hoz a Laravel 5?

A Laravel jelenleg fejlesztés alatt álló verziója az 5.0, amely hallatán jogosan merül fel a kérdés, hogy miért vált főverziószámot a 4.2 után? A cikkben ezt a kérdést próbálom megválaszolni.


Az eddigi trend szerint minor verzió váltás nagyjából fél évente volt, és a behozott változtatások néhány esetben a visszafelé kompatibilitás elvesztését okozták. Ezek viszont kisebb időráfordítással, és a frissítési útmutató követésével könnyen javíthatóak voltak.

A 4.2 megjelenése után eleinte 4.3 néven futott az új verzió fejlesztése, de az egyre radikálisabb változtatások következtében a fejlesztőknek major verziószámot is váltani kellett. A cikk időpontjáig megjelent főbb újításokat az alábbi listába gyűjtöttem össze:

Új mappastruktúra

Az egyik nagyobb volumenű újítás az áttervezett mappastruktúra. A korábbi app mappába mostantól csak az osztályok kerülnek, alapértelmezetten App/ névtérrel ellátva. Ez azonban ízlés szerint módosítható az app:name Artisan parancs segítségével.

  • app - az alkalmazáshoz tartozó osztályok PSR-4 osztálybetöltéssel
  • bootstrap - indításhoz szükséges fájlok, például az alkalmazás példányt létrehozó kód
  • config - konfigurációs állományok
  • database - adatbázis migráció és seed osztályok
  • public - nyilvános mappa
  • resources - különböző erőforrások
    • assets - fordítandó less, sass, coffee ... stb fájlok
    • lang - nyelvi fájlok
    • views - nézetek
  • storage - futtatás közben generált cache és naplófájlok
  • tests - az alkalmazáshoz tartozó tesztek

Dotenv integrálása

Az eddigi Laravel verziókban is megadhattunk környezeti változókat a főkönyvtárban elhelyezett .env.<kornyezet_neve>.php fájlok segítségével. Viszont a környezet nevét (például dev, local, production ... stb) a webszerver vagy az operációs rendszer környezeti változóinál kellett megadni. Ennek egyszerűsítése érdekében az új verzióba integrálták a vlucas/phpdotenv csomagot, amely egy központosított .env fájlból olvassa ki a szükséges változókat, beleértve a környezet nevét is.

// .env.example

APP_ENV=local
APP_KEY=SomeRandomString
DB_USERNAME=homestead
DB_PASSWORD=homestead

Contracts komponens

Az egyik legfontosabb újítása az új verziónak, lényegében egy interfész gyűjtemény, amely segítségével könnyebben kicserélhetővé válnak a keretrendszer bizonyos részei az IoC konténerben.

https://github.com/illuminate/contracts

Method Injection

A függőségek automatikus kielégítését az IoC konténer eddig csak a konstruktoron keresztül alkalmazta. Ennek viszont az a hátránya, hogy akkor is el kell tárolni az adott objektumot, ha csak egy metódusban van rá szükségünk. Ezért az új verziótól kezdve lehetőségünk lesz a method injection használatára, például:

Tipp! A keretrendszer szolgáltatásaihoz érdemes használni az előző pontban bemutatott interfészeket.

public function upload(Dispatcher $dispatcher)
{
    $dispatcher->fire('image.uploaded');
}

FormRequest osztályok

A FormRequest osztályok segítségével elválaszthatjuk az űrlapokhoz tartozó validációt a vezérlő osztályoktól, ezzel lényegében lerövidítve az űrlap feldolgozást. Példaként vegyük az alábbi kódot:

public function getCreate()
{
    return view('users.create');
}

public function postCreate(CreateUserRequest $request)
{
    // Automatikus validáció, majd:

    // - Hibás adatok esetén a rendszer visszaugrik
    // - Helyes adatok esetén lefut az itt lévő kód

    // ...
}

Flysystem integrálása

A thephpleague/flysystem egy fájlrendszer absztrakciós réteg, amellyel könnyen kicserélhetjük a helyi fájlrendszerünket egy távoli fájlrendszerre. Például, ha a weboldalunkhoz tartozó statikus fájlokat Amazon S3 vagy Dropbox segítségével szeretnénk kiszolgálni.

Route és Event annotációk

Az annotációk használata megosztja a PHP fejlesztőket, mert a nyelv még nem rendelkezik natív támogatással. Ezért a legtöbb projekt a doctrine/annotations csomagot alkalmazza, amely az osztályokhoz és metódusokhoz tartozó komment blokkokban keresi az annotációkat. A Laravel keretrendszerbe is beépítésre került a csomag, így ezentúl használhatunk annotációkat a vezérlő és eseménykezelő osztályokban.

Például vezérlő osztályokban:

/**
 * @Get("/show/{id}", as="user_show")
 */
public function show($id)
{
    // ...
}

Vagy eseménykezelőkben:

/**
 * @Hears("user.created")
 */
public function notify(User $user)
{
    // ...
}

Elixir

Az Elixir egy npm csomag, ami előre összeállított gulp.js feladatokat tartalmaz Laravel alkalmazásokhoz. Például az előző pontban bemutatott annotációkhoz is tartalmaz watch típusú feladatokat, így ha egy vezérlőn vagy eseménykezelőn módosítunk, azonnal lefut az annotációk vizsgálata. Illetve nagy segítség lehet frontend fejlesztők részére is, mert less és sass fordításhoz szükséges feladatokat is tartalmaz.

Példaként az alapértelmezett gulpfile.js a Laravel projekt sablonból:

// gulpfile.js

elixir(function(mix) {
    mix.sass("bootstrap.scss")
        .routes()
        .events()
        .phpUnit();
});

Socialite

Lassan megkerülhetetlen lesz, hogy a weboldalainkat összekössük közösségi oldalakkal a teljesebb felhasználói élmény érdekében. Ebben segít a Socialite, amely OAuth Provider osztályokat tartalmaz a közösségi oldalak bekötéséhez.