Laravel 8.x – zmiany
Kolejna wersja popularnego frameworka Laravel została wydana w dniu 8-go września 2020. Aplikacja oznaczona numerem 8 wprowadza szereg zmian i ulepszeń. Artykuł opisuje niektóre z nich oraz pokazuje przykłady użycia.
Przepisana fabryka modeli
W nowej wersji frameworka została przepisana funkcjonalność fabryki modeli. Funkcjonalność ta pozwala na szybkie wygenerowanie określonej ilości wpisów w bazie danych, które następnie mogą służyć do testów aplikacji. Do teraz zastosowanie fabryki modeli realizowane było za pomocą funkcji pomocniczej factory.
1 2 3 |
factory(App\User::class, 50)->create()->each(function ($user) { $user->posts()->save(factory(App\Post::class)->make()); }); |
Powyższa funkcja tworzyła 50-ciu użytkowników i dla każdego z nich zapisywało posta w bazie danych.
Od wersji 8 fabryki modeli można definiować jako klasy, w której ustawiamy sposób generowania modeli.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?php namespace Database\Factories; use App\Models\User; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Str; class UserFactory extends Factory { /** * The name of the factory's corresponding model. * * @var string */ protected $model = User::class; /** * Define the model's default state. * * @return array */ public function definition() { return [ 'name' => $this->faker->name, 'email' => $this->faker->unique()->safeEmail, 'email_verified_at' => now(), 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password 'remember_token' => Str::random(10), ]; } } |
Klasy fabryki modeli mają dostęp do instancji Faker, która pozwala na generowanie losowych danych dla testów. Następnie taką klasę można użyć wywołując statyczną metodę „facory” dla danego modelu.
1 2 3 |
use App\Models\User; User::factory()->count(50)->create(); |
Fabryka modeli posiada szereg przydatnych funkcjonalności. Do poznania wszystkich możliwości, zapraszam do zapoznania się z dokumentacją frameworka.
Grupowanie zadań kolejki
Funkcjonalność pozwala na łączenie zadań kolejki w „paczki”, a następnie ich uruchamianie i na końcu wywoływanie funkcji w przypadku niepowodzenia wykonania któregoś z zadań lub w przypadku poprawnego zakończenia działania.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
use App\Jobs\ProcessPodcast; use App\Podcast; use Illuminate\Bus\Batch; use Illuminate\Support\Facades\Bus; use Throwable; $batch = Bus::batch([ new ProcessPodcast(Podcast::find(1)), new ProcessPodcast(Podcast::find(2)), new ProcessPodcast(Podcast::find(3)), new ProcessPodcast(Podcast::find(4)), new ProcessPodcast(Podcast::find(5)), ])->then(function (Batch $batch) { // All jobs completed successfully... })->catch(function (Batch $batch, Throwable $e) { // First batch job failure detected... })->finally(function (Batch $batch) { // The batch has finished executing... })->dispatch(); return $batch->id; |
Zmiana obejścia blokady aplikacji
W poprzednich wersjach, przy ustawianiu trybu maintetance mode, istniała możliwość dodania listy adresów IP, dla których aplikacja była wciąż dostępna. W nowej wersji, funkcjonalność ta została zastąpiona na rzecz tokenu, który ustawia się podczas włączenia trybu.
1 2 3 |
php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515" |
Po wpisaniu powyższej komendy, aplikacja nie będzie dostępna na zewnątrz. Dzięki wprowadzonemu tokenowi, istnieje jednak możliwość obejścia blokady poprzez wpisanie odpowiedniego adresu.
1 2 3 |
https://example.com/1630542a-246b-4b66-afa1-dd72a4c43515 |
Po wejściu w taki URL, zostaniemy przekierowaniu do strony głównej, a w przeglądarce zostanie ustawione ciasteczko, dzięki któremu będziemy mieć w dalszym ciągu dostęp do aplikacji.
Możliwość przesunięcia aktualnego czasu w funkcjach testowych
Do metod testowych, wprowadzona została funkcja umożliwiająca tymczasowe przesuwanie czasu w przeszłość lub przyszłość.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public function testTimeCanBeManipulated() { // Travel into the future... $this->travel(5)->milliseconds(); $this->travel(5)->seconds(); $this->travel(5)->minutes(); $this->travel(5)->hours(); $this->travel(5)->days(); $this->travel(5)->weeks(); $this->travel(5)->years(); // Travel into the past... $this->travel(-5)->hours(); // Travel to an explicit time... $this->travelTo(now()->subHours(6)); // Return back to the present time... $this->travelBack(); } |
Inne zmiany
- Wprowadzono Laravel Jetstream, który jest nową wersją boilerplate-a dla autoryzacji użytkownika. Umożliwia szybkie ustawienie logowania użytkownika, rejestracji, weryfikacji e-mail, zarządzanie sesją użytkownika, autoryzacja API za pomocą biblioteki Laravel Sanctum, itp. Szablony zostały zaprojektowane przy użyciu frameworka Tailwind CSS.
- Domyślnym katalogiem dla modeli Eloquent został zmieniony na app/Models.
- Możliwość łączenia migracji za pomocą komendy Artisan schema:dump.
- Polepszona funkcjonalność RateLimiter.
- Możliwość definiowania event listener-ów opartych na funkcji Closure i inne ulepszenia dla tej funkcjonalności.
- Dynamiczne komponenty dla systemu szablonów Blade.
- Ulepszona komenda Artisan serve.
Zmian wprowadzonych w wersji 8 jest oczywiście znacznie więcej. Zapraszam do zapoznania się z nimi w oficjalnej dokumentacji Laravel-a.