Laravel 5 – nowości

Luty 15th, 2015

W lutym 2015 roku dostaliśmy w końcu nowe wydanie frameworka Laravel oznaczonego numerkiem 5.
Przyglądając się wprowadzonym zmianom możemy stwierdzić że to jest ewolucja frameworka niż rewolucja.
Parę mechanizmów zostało przepisanych, dodano parę nowych. Myślę że osoby które używały Laravel’a wersji 4 w wersji 5 znajdą coś dla siebie.

Wpis głównie bazuje na artykule: http://laravel.com/docs/master/releases#laravel-5.0

Struktura plików.

Została zmodyfikowana podstawowa struktura plików i katalogów dla domyślnego projektu Laravel. Teraz framework zapewnia wsparcie do obsługi PSR-4

Wszystkie pliki które znajdują się w katalogu ‘app’ domyślnie są organizowane w przestrzeni nazw ‘App’

namespace 'App'.

Jeśli zachodzi potrzeba zmiany nazwy przestrzeni nazw można to bardzo szybko i prosto zrobić za pomocą narzędzia artisan i komendy ‘app:name’

./artisan app:name nowaNazwaPrzestrzeni

Pliki: controllers, middleware i nowy typ: request zostały przeniesione do katalogu app/Http. W katalogu tym znajdują się wszystkie klasy związane z warstwą transportu HTTP.
Plik app/routes.php również został przeniesiony do katalogu app/Http. Pozbyto się pliku filters.php. Zamiast niego filtry są tworzone za pomocą klas Middleware. Jedna klasa odzwierciedla jeden filtr.

app/models – usunięte

app/start zostało zastąpione app/Providers. W katalogu tym znajdują się dostawcy usług, które są wykorzystywane w Twojej aplikacji, przykładowo obsługa tras (route), logowania itp. Nic nie stoi na przeszkodzie aby dodać własnego dostawcę.

Pliki językowe jak i widoki zostały przeniesione do folderu: resource znajdującego się w głównym katalogu.

Kontrakty.

Kontrakty to nic innego jak zbiór interfejsów dostarczanych przez framework Laravel. Znajdują się one w przestrzeni „Illuminate/contracts’. Możemy ich użyć do nadzorowania wstrzykiwania zależności. Według twórców jest to alternatywa to Laravel’owych fasad. Oczywiście nic nie stoi na przeszkodzie aby zdefiniować własne kontrakty, we własnej przestrzeni nazw i ich używać.
Dokumentacja

Route Cache

Jeśli routing w aplikacji jest oparty na kontrolerach to możemy użyć nowej komendy narzędzia artisan – route:cache. Dzięki temu poleceniu przyśpieszymy obsługę tras (routes) w naszej aplikacji. Mocno zalecane jest użycie tej opcji w aplikacji w której mamy zdefiniowanych ponad 100 tras.

Route Middleware

Jest to tak naprawdę przepisana obsługa filtrów z Laravel 4.2. Middleware zapewnia nam prosty interfejs do obsługi filtrów. Dzięki temu już na wstępie możemy przeanalizować lub odrzucić requesty zanim trafią do obsługi przez kontrolery naszej aplikacji.
Dokumentacja

Controller Method Injection.

Nowy sposób wstrzykiwania zależności do kontrolerów. Teraz możemy wstrzykiwać zależności na podstawie typowania parametrów przekazanych do konstruktora lub do innej metody kontrolera. Kontener IoC następnie automatycznie wstrzyknie zależności na podstawie typów parametrów przekazanych do konstruktora, nawet jeśli są jeszcze zdefiniowane inne parametry poprzez route (trasę).

public function createPost(Request $request, PostRepository $posts)
{
//
}

Event Objects

Jest to obiektowy sposób tworzenia zdarzeń (event’ow) w aplikacji.

Tworzymy klasę zdarzenia.

class PodcastWasPurchased {

    public $podcast;

    public function __construct(Podcast $podcast)
    {
        $this->podcast = $podcast;
    }
}

// zgłoszenie zdarzenia
Event::fire(new PodcastWasPurchased($podcast));

W tym przypadku klasa do obsługi zdarzenia otrzyma zamiast listy parametrów obiekt zdarzenia ‘PodcastWasPurchased’.
Poniżej mamy napisaną klasę od obsługi zdarzenia:

class ReportPodcastPurchase {

    // należy zwrócić uwagę na typ parametru przekazanego do metody handle
    public function handle(PodcastWasPurchased $event)
    {
        // ...
    }
}

Czyli mamy już komplet:

  • Klasę zdarzenia
  • Zgłoszenie zdarzenia
  • Klasę do obsługi zdarzenia danego typu

Dokumentacja

Commands / Queueing

W Laravel 5 wprowadzono możliwość przedstawienia elementów kolejki jako obiektów klasy dziedziczącej po klasie Command.

class PurchasePodcast extends Command implements SelfHandling, ShouldBeQueued {

    use SerializesModels;

    protected $user, $podcast;

    public function __construct(User $user, Podcast $podcast)
    {
        $this->user = $user;
        $this->podcast = $podcast;
    }

    public function handle()
    {
        event(new PodcastWasPurchased($this->user, $this->podcast));
    }
}

Udostępniony został trait DispatchesCommands, dzięki któremu możemy w łatwy sposób dodawać kolejne zadania (commands) do wykonania. Trait ten jest domyślnie używany przez kontroler w starterze dostarczanym przez framework.

// możemy wykonać
$this->dispatch(new PurchasePodcastCommand($user, $podcast));

Nie ma też problemu aby używać zadań (command) synchronicznie a nie w kolejkach.

Kolejki i zadania są dobrym rozwiązaniem aby oddzielić od kontekstu i odłożyć w tło zadania które są ciężkie do wykonania.

Dokumentacja

Database Queue

W tej chwili nie jest już wymagane osobne instalowanie „sterownika” do obsługi kolejek bazodanowych. Sterownik jest już włączony do paczki instalacyjnej Laravel’a.

Laravel Scheduler

W poprzednich wersjach dla każdego polecenia, które chcieliśmy cyklicznie wykonywać z konsoli trzeba było generować wpisy do cron’a, co tak naprawdę nie jest do końca wygodne i ciężko nad tym zapanować jeśli takie skrypty się nam namnożą.
Teraz wystarczy dodać jeden wpis do crona, aby Laravel mógł zarządzać naszymi poleceniami, które chcemy odpalać cyklicznie.

* * * * * php /path/to/artisan schedule:run 1>> /dev/null 2>&1

Następnie wystarczy użyć:

$schedule->command('artisan:command')->dailyAt('15:00');

aby dodać nowe zadanie do wykonania. W tym przypadku codziennie o 15:00.

Tinker / Psysh

W Laravel 5 Tinker (REPL – Read-Eval-Print Loop) używa Psysh, które posiada większe możliwości od używanego w poprzednich wersjach systemu Boris. Dla niektórych zaletą będzie również fakt, że działa pod systemem Windows.

php artisan tinker

DotEnv

Kwestie konfiguracji środowiska na którym pracowaliśmy w Laravel 4.x oparta była na katalogach. W Laravel 5 wprowadzone zostało rozwiązanie DotEnv, którego autorem jest Vance Lucas. W definicji nowe rozwiązanie ma zapewnić o wiele łatwiejszy sposób konfiguracji kwestii środowiskowych opartych na plikach .env
Dokumentacja

Laravel Elixir

Rozwiązanie to zapewnia interfejs do obsługi zadań związanych z naszymi ‘assetami’. Pozwala między innymi kompilować pliki Less, Sass, CoffeScript. Możemy też za jego pomocą uruchamiać testy. Rozwiązanie jest oparte na bibliotece Gulp, jednak nie wymaga od nas jej kompleksowej znajomości. Ma się charakteryzować niskim progiem wejścia.

Dokumentacja

Laravel Socialite

Jest to opcjonalny pakiet umożliwiający prostą autentykację z użyciem OAuth. W tej chwili w wersji 5.0 wspierane są: Facebook, Twitter, Google oraz GitHub.

Przykład:

public function redirectForAuth()
{
    return Socialize::with('twitter')->redirect();
}

public function getUserFromProvider()
{
    $user = Socialize::with('twitter')->user();
}

Dokumentacja

Flysystem Integration

Laravel wdrożył obsługę rozwiązania Flysystem do obsługi lokalnych jak i zdalnych systemów plików. Dzięki niej możemy się integrować z takimi chmurami (cloud storage) jak Amazon S3 oraz Rackspace oraz do zwykłych plików umieszczonych na dysku używając takiego samego interfejsu.

Przykład zapisania danych do pliku:

Storage::put('file.txt', 'contents');

Dokumentacja

Form Requests

Możemy teraz tworzyć tak zwane klasy ‘form request’ które to rozszerzają: Illuminate\Foundation\Http\FormRequest. Można by powiedzieć że jest to coś w rodzaju rozszerzenia obiektu request o obsługę formularza. Taki nowy obiekt może być następnie wstrzyknięty do metody kontrolera obsługującej request.

Przykład:

namespace App\Http\Requests; 

class RegisterRequest extends FormRequest {
    public function rules()     {
        return [
            'email' => 'required|email|unique:users',
            'password' => 'required|confirmed|min:8',
        ];
    }

    public function authorize()
    {
        return true;
    }
}

Kontroller:

public function register(RegisterRequest $request)
{
    var_dump($request->input());
}

Kiedy IoC Laravel’a rozpozna że wstrzyknięta klasa jest instancją FormRequest, zostanie ona automatycznie zwalidowana. To znaczy, że w trakcie wywołania akcji kontrolera możesz bezpiecznie przyjąć że dane które są do niego przekazane za pomocą obiektu FormRequest spełniają warunki które zdefiniowane są w regułach walidacji.
W przypadku gdy któraś z reguł nie zostanie spełniona automatycznie zostanie wygenerowany błąd, który zostanie zapisany do sesji, na czas trwania tego requestu (flashed message) lub skonwertowana do formatu JSON (w zależności od rodzaju requestu). Następnie zostanie wygenerowane odpowiednie przekierowanie, które oczywiście można samemu określić.

Dokumentacja

Simple Controller Request Validation

Klasa bazowa kontrolera dostarczanego razem z Laravel 5 używa cechy (trait) ValidatesRequests. Zapewnia ona prostą funkcjonalność umożliwiającą walidację nadchodzących żądań. Jeśli FormRequest jest przerostem formy nad treścią można w aplikacji walidować dane w następujący sposób:

Klasa kontrolera:

public function createPost(Request $request)
{
    $this->validate($request, [
        'title' => 'required|max:255',
        'body' => 'required',
    ]);
}

Jeśli walidacja się nie powiedzie zostanie zgłoszony wyjątek który zostaje automatycznie przechwycony i zostanie wygenerowana odpowiedź HTTP. Podobnie jak przy FormRequest komunikat zostanie zapisany w jako ‘flash message’ lub odpowiednio skonwertowany do postaci JSON

Dokumentacja

Nowe generatory dla wiersza poleceń artisan

Aby obejrzeć ich listę należy wywołać: php artisan list i przeglądnąć wynik

Configuration Cache.

Artisan umożliwia nam połączenie plików konfiguracyjnych do jednego pliku za pomocą komendy config:cache

Symfony VarDumper

Funkcja pomocnicza dd ułatwiająca debugowanie aplikacji opiera się teraz na Symfony VarDumper.

dd([1, 2, 3]);

Podsumowanie

To jest tylko część zmian wprowadzonych wraz z wersją piątą frameworka. Niektórym z pewnością przypadną do gustu innym nie. Dla mnie jednak wyglądają obiecująco. Ciekawie wygląda alternatywa dla fasad, dzięki czemu nasz kod zysska na pewno na przejrzystości.

  1. Przemek
    Marzec 24th, 2015 at 23:09 | #1

    Jak zawsze profesjonalnie, dzięki Tomku !

  1. Brak jeszcze trackbacków
Komentarze są zamknięte