Laravel 8 releases - Part 1

LAMP Oct 21, 2020

Bạn cần bỏ ra xxx phút để đọc hết bài này!


Với mỗi 6 tháng, framework Laravel sẽ được phát hành một version mới kèm theo bản nâng cấp về bảo mật cũng như xử lý các bug.

Tháng 9 vừa rồi, Laravel đã phát hành phiên bản thứ 8 kèm theo nhiều tính năng mới đầy hấp dẫn, hãy cũng mình dạo quanh một vòng xem có gì đặc sắc nhé 😘


Laravel Jetstream

Không phải ngẫu nhiên Laravel Jetstream được nhà phát hành nói tới đầu tiên. Thực sự đây là một tính năng khá thú vị được ra mắt trong phiên bản 8 này.
Thay thế cho Laravel UI đã tồn tại từ trước, Laravel Jetstream là điểm mở đầu cho dự án bao gồm đăng nhập, đăng ký, xác nhận email, two-factor authentication, ....

Jetstream được thiết kể sử dụng Tailwind CSS. Bạn có thể chọn một trong hai Livewire hoặc Inertia làm nền tảng để sử dụng.
(Livewire | Inertia là gì thì bạn có thể truy cập link để tìm hiểu, hoặc sẽ có bài giới thiệu trong các số tiếp theo nhé 😁)

Hiểu nôm na là:

  • Livewire + Blade
  • Inertia.js + Vue

Models directory

Hẳn rất nhiều người từng thắc mắc, có thư mục controllers mà thư mục models sao không thấy.

Để thỏa mãn nhu cầu của cộng đồng, với phiên bản này khi khởi tạo model qua command các file sẽ được đưa vào thư mục app/Models nếu tồn tại, còn không thì vẫn như các phiên bản trước, file model sẽ mặc định được để ở thư mục app


Model Factory Classes

Hiểu như nào nhỉ, bạn cần insert một vài bản ghi vào database trước khi tiến hành chạy test. Thay vì sử dụng cơm 🍙 đưa từng giá trị vào database thì bạn sẽ có một lớp model Factory thay thế cho việc đó.
Với phiên bản trước bạn sẽ phải tạo một số đoạn code sau:

use Faker\Generator as Faker;
use Illuminate\Support\Str;

$factory->define(App\User::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'email_verified_at' => now(),
        'password' => bcrypt('password'), // password
        'remember_token' => Str::random(10),
    ];
});

Tuy nhiên, với phiên bản 8 được viết lại như là các class base theo factories và cải thiện dữ liệu giữa các quan hệ first-class relationship:

<?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' => bcrypt('password'), // password
            'remember_token' => Str::random(10),
        ];
    }
}

và sau đó để sử dụng, bạn sẽ cần dùng như sau:

use App\Models\User;

User::factory()->count(50)->create();

Còn nhiều tính năng với fatory class mà có thể hữu ích với bạn, bạn có thể truy cập
database testing documentation để tìm hiểu thêm 😄


Migration Squashing

Khi ứng dụng có quá nhiều file migrate, bạn có thể (squash) đưa chúng vào chung một file SQL. File này sẽ được thực thi trước tiên khi chạy migrate, tiếp theo đó là các file migrate còn lại không nằm trong file squash.

Việc squash các file lại có thể làm giảm sự phình to của dự án và tăng hiệu suất khi chạy thử nghiệm

để bắt đầu, thực thi lệnh schema:dump:

php artisan schema:dump

Improved Rate Limiting

Laravel 8 mang tới sự cải thiện hàm rate limiting đã có từ trước, đồng thời tương thích ngược với các middleware tạo sự linh hoạt hơn
Việc định nghĩa có thể qua một facade như sau:

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;

RateLimiter::for('global', function (Request $request) {
    return Limit::perMinute(1000);
});

Như bạn thấy, hàm for sẽ nắm bắt các HTTP request instance, cung cấp cho bạn đầy đủ quyền kiểm soát giới hạn các yêu cầu vào hệ thống.

sau đó bạn có thể dựng các rate limiting thích hợp và kết hợp với middleware như sau:

RateLimiter::for('uploads', function (Request $request) {
    return $request->user()->vipCustomer()
                ? Limit::none()
                : Limit::perMinute(100);
});

và kết hợp với middleware cho routing:

Route::middleware(['throttle:uploads'])->group(function () {
    Route::post('/audio', function () {
        //
    });

    Route::post('/video', function () {
        //
    });
});

Improved Maintenance Mode

Trong phiên bản này, khi ở chế độ maintain, bạn vẫn sẽ có thể truy cập hệ thống thông qua secret token bằng cách chạy:

php artisan down --secret="xxx_token"

và để có thể truy cập khi đang bật chế độ maintain, truy cập theo dạng dưới:

https://example.com/xxx_token

Routing Namespace Updates

Trong các bản release trước, thì RouteServiceProvider chứa thuộc tính

protected $namespace = 'App\Http\Controllers';

Giá trị trong thuộc tính này được tự động trở thành prefix cho các định nghĩa controller route và gọi tới phương thức action của helper URL::action.

Trong phiên bản laravel 8, thì giá trị này mặc định cho về null. Có nghĩa là các namespace không tự động được điền sẵn prefix. Vì thế, với bản laravel 8.x, các định nghĩa controller route sẽ được sử dụng cú pháp PHP cơ bản như sau:

use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);

Còn nếu bạn muốn giữ nguyên prefix giống như bản 7.x, đơn giản chỉ cần thêm thuộc tính $namespace như bên trên vào RouteServiceProvider mà thôi 😎


Trên đây là một số điểm mới của laravel 8.x, hãy đón chờ xem phần tiếp theo hoặc vào trang chủ https://laravel.com/ để biết thêm chi tiết.

Cảm ơn bạn đã theo dõi,
Hẹn gặp lại trong các bài viết tiếp theo 🥳🥳🥳

Tags

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.