Có gì mới trong Laravel 7

Mục lục

Đánh tên phiên bản

Laravel và các gói đi kèm đều dựa theo Semantic Versioning. Các bản phát hành chính thức thường được công khai định kỳ 6 tháng một lần (khoảng tháng 2 và tháng 8), trong khi các bản phát hành phụ hoặc bản vá thì được phát hành thường xuyên hàng tuần. Các bản phát hành phụ hoặc bản vá sẽ không bao giờ chứa sự thay đổi nào lớn cả.

Khi sử dụng framework Laravel hoặc các thành phần của nó trong ứng dụng của bạn, bạn nên sử dụng các ràng buộc cho phiên bản, ví dụ như ^7.0, bởi vì các bản phát hành chính thức sẽ có những thay đổi lớn. Tuy nhiên, chúng tôi cố gắng để luôn đảm bảo rằng thời gian cập nhật từ phiên bản cũ lên phiên bản mới sẽ chỉ trong ngày hoặc nhanh hơn.

Chính sách hỗ trợ

Đối với các bản phát hành LTS (Long Term Support), chẳng hạn như Laravel 6, các lỗi thông thường sẽ được hỗ trợ vá lỗi trong vòng 2 năm và các lỗi về bảo mật sẽ được hỗ trợ vá lỗi trong 3 năm. Những bản phát hành này luôn cung cấp thời hạn hỗ trợ và bảo trì dài nhất. Đối với các bản phát hành phổ biến khác, các lỗi thông thường sẽ được hỗ trợ vá lỗi trong vòng 6 tháng và các lỗi bảo mật sẽ được hỗ trợ trong vòng 1 năm. Đối với tất cả các thư viện bổ sung, bao gòm Lumen, chỉ hỗ trợ vá lỗi ở bản phát hành gần nhất. Ngoài ra, mời bạn cùng xem qua bảng thông tin về các phiên bản được hỗ trợ bởi Laravel.

Phiên bản Ngày phát hành Thời hạn vá lỗi thông thường Thời hạn vá lỗi bảo mật
5.5 (LTS) August 30th, 2017 August 30th, 2019 August 30th, 2020
5.6 February 7th, 2018 August 7th, 2018 February 7th, 2019
5.7 September 4th, 2018 March 4th, 2019 September 4th, 2019
5.8 February 26th, 2019 August 26th, 2019 February 26th, 2020
6 (LTS) September 3rd, 2019 September 3rd, 2021 September 3rd, 2022
7 March 3rd, 2020 September 3rd, 2020 March 3rd, 2021

Laravel 7

Laravel 7 tiếp tục phát triển những cải thiện đã có trong Laravel 6.x bằng việc giới thiệu Laravel Airlock, cải thiện tốc độ định tuyến, tùy biến Eloquent casts, các thẻ trong Blade, xử lý string mượt mà hơn, tập trung phát triển cho HTTP Client, hỗ trợ CORS, cải thiện việc giới hạn phạm vi cho route-model binding, tùy biến các file cơ bản được sinh ra từ artisan command, cải thiện hàng đợi khi truy vấn database, cho phép có nhiều trình điều khiển email, thay đổi kiểu thời gian trong câu query, có thêm câu lệnh mới artisan test, cùng nhiều lỗi được vá và các cải thiện khả năng sử dụng khác.

Laravel Airlock

Laravel Airlock được phát triển bởi Taylor Otwell.

Laravel Airlock cung cấp một hệ thống xác thực gọn nhẹ cho các SPA (single page applications), các ứng dụng di động, và đơn giảm, là cho các API xác thực bằng token. Airlock cho phép mỗi người dùng hệ thống của bạn tạo ra nhiều API token cho tài khoản của họ. Những token này có thể được cấp các khả năng/phạm vi chỉ định cho các hành động mà các token này được phép thực hiện.

Để biết thêm thông tin về Laravel Airlock, tham khảo tài liệu Airlock.

Tùy biến việc đổi kiểu dữ liệu trong Eloquent

Tùy biến việc đổi kiểu dữ liệu trong Eloquent được phát triển bởi Taylor Otwell.

Laravel có rất nhiều kiểu dữ liệu chuyển đổi có sẵn và xịn xò, tuy nhiên, thỉnh thoảng bạn có thể cần định nghĩa kiểu dữ liệu riêng của mình. Bạn có thể làm được điều này bằng cách định nghĩa một class có implement giao diện CastsAttributes.

Những class mà implement giao diện này phải định nghĩa cặp phương thức getset. Phương thức get được dùng để chuyển đổi dữ liệu từ dạng nguyên bản lấy từ database thành dữ liệu đã được đổi kiểu, còn phương thức set chuyển đổi dữ liệu từ dạng đang được đổi kiểu sang dữ liệu dạng nguyên bản để có thể lưu vào database. Ví dụ sau đây, chúng ta sẽ hiện thực lại kiểu dữ liệu json có sẵn thành kiểu dữ liệu chuyển đổi được tùy biến:

    <?php

    namespace App\Casts;

    use Illuminate\Contracts\Database\Eloquent\CastsAttributes;

    class Json implements CastsAttributes
    {
        /**
         * Cast the given value.
         *
         * @param  \Illuminate\Database\Eloquent\Model  $model
         * @param  string  $key
         * @param  mixed  $value
         * @param  array  $attributes
         * @return array
         */
        public function get($model, $key, $value, $attributes)
        {
            return json_decode($value, true);
        }

        /**
         * Prepare the given value for storage.
         *
         * @param  \Illuminate\Database\Eloquent\Model  $model
         * @param  string  $key
         * @param  array  $value
         * @param  array  $attributes
         * @return string
         */
        public function set($model, $key, $value, $attributes)
        {
            return json_encode($value);
        }
    }

Khi mà bạn đã định nghĩa kiểu dữ liệu chuyển đổi tùy biến rồi, bạn có thể gắn nó vào một thuộc tính của model bằng cách sử dụng tên class của nó:

    <?php

    namespace App;

    use App\Casts\Json;
    use Illuminate\Database\Eloquent\Model;

    class User extends Model
    {
        /**
         * The attributes that should be cast to native types.
         *
         * @var array
         */
        protected $casts = [
            'options' => Json::class,
        ];
    }

Để tìm hiểu cách viết các kiểu chuyển đổi cho Eloquent, bao hồm cả các kiểu tùy biến, hay tham khảo thêm tài liệu về Eloquent.

Các thẻ thành phần Blade và các cải thiện

Các thẻ thành phần Blade được phát triển bởi Spatie, Marcel Pociot, Caleb Porzio, Dries Vints, và Taylor Otwell.

Các thành phần trong Blade được xem xét lại để cho phép việc hiển thị theo thẻ tag (giống kiểu VueJS), quản lý thuộc tính, các lớp thành phần, các thành phần trong giao diện,… Bởi vì việc chỉnh sửa lần này có rất nhiều thông tin liên quan, hãy tham khảo tài liệu đầy đủ về thành phần Blade để biết thêm về phần này.

Tóm lại, một thành phần bây giờ có thể có một lớp liên kết, sẽ xác định các dữ liệu mà nó chấp nhận. Tất cả các thuộc tính và phương thức công khai được định nghĩa trong lớp thành phần sẽ được tự động thêm vào trong giao diện của thành phần. Bất kỳ thuộc tính HTML bổ sung nào được xác định trong thành phần đều có thể được quản lý bằng một biến có sẵn $attributes, là một thực thể chứa các thuộc tính.

Trong ví dụ này, chúng ta sẽ giả định rằng một thành phần App\View\Components\Alert được định nghĩa như sau:

    <?php

    namespace App\View\Components;

    use Illuminate\View\Component;

    class Alert extends Component
    {
        /**
         * The alert type.
         *
         * @var string
         */
        public $type;

        /**
         * Create the component instance.
         *
         * @param  string  $type
         * @return void
         */
        public function __construct($type)
        {
            $this->type = $type;
        }

        /**
         * Get the class for the given alert type.
         *
         * @return string
         */
        public function classForType()
        {
            return $this->type == 'danger' ? 'alert-danger' : 'alert-warning';
        }

        /**
         * Get the view / contents that represent the component.
         *
         * @return \Illuminate\View\View|string
         */
        public function render()
        {
            return view('components.alert');
        }
    }

Và giả sử rằng mẫu Blade của thành phần được định nghĩa như sau:

    <!-- /resources/views/components/alert.blade.php -->

    <div class="alert {{ $classForType }}" {{ $attributes }}>
        {{ $heading }}

        {{ $slot }}
    </div>

Thành phần này có thể được hiển thị trong một thẻ của thành phần trong giao diện khác:

    <x-alert type="error" class="mb-4">
        <x-slot name="heading">
            Alert content...
        </x-slot>

        Default slot content...
    </x-alert>

Như đã đề cập, đây chỉ là một ví dụ rất nhỏ của việc chỉnh lại chức năng của thành phần Blade trong Laravel 7 và không mô tả về các thành phần vô danh, các thành phần hiển thị theo từng dòng và một số các tính năng khác. Hãy tham khảo tài liệu đầy đủ về thành phần Blade để tìm hiểu thêm về tính năng này nhé.

Cú pháp @component ngày trước cho thành phần Blade sẽ không bị gỡ bỏ.

HTTP Client

HTTP client là một gói thư viện của Guzzle và được phát triển bởi Adam Wathan, Jason McCreary, and Taylor Otwell.

Laravel bản mới mang lại một loạt các API vừa đơn giản tinh gọn lại dễ dùng, sử dụng Guzzle HTTP client, cho phép bạn tạo các request HTTP một cách nhanh chóng để giao tiếp với các ứng dụng web khác. Gói thư viện mới này của Laravel sử dụng Guzzle được tập trung vào các trường hợp sử dụng thường xuyên nhất và sẽ là một trải nghiệm tuyệt vời trong khi phát triển web. Ví dụ, bên máy khách tạo một POST request và giao diện kết nối dùng data dạng JSON.

    use Illuminate\Support\Facades\Http;

    $response = Http::withHeaders([
        'X-First' => 'foo',
        'X-Second' => 'bar'
    ])->post('http://test.com/users', [
        'name' => 'Taylor',
    ]);

    return $response['id'];

Ngoài ra, HTTP client cũng cung cấp chức năng test rất dễ dùng và xịn xò:

    Http::fake([
        // Stub a JSON response for GitHub endpoints...
        'github.com/*' => Http::response(['foo' => 'bar'], 200, ['Headers']),

        // Stub a string response for Google endpoints...
        'google.com/*' => Http::response('Hello World', 200, ['Headers']),

        // Stub a series of responses for Facebook endpoints...
        'facebook.com/*' => Http::sequence()
                                ->push('Hello World', 200)
                                ->push(['foo' => 'bar'], 200)
                                ->pushStatus(404),
    ]);

Để tìm hiểu thêm về tất cả tính năng của HTTP Client, tham khảo tại tài liệu HTTP client.

Hàm xử lý String

Các hàm xử lý string được phát triển bởi Taylor Otwell.

Có vẻ như bạn đã khá quen với lớp Illuminate\Support\Str chuyên dùng để xử lý string của Laravel, cái mà mang lại rất nhiều những hàm hữu dụng để thao tác với string. Laravel 7 giờ đây đem đến một thư viện xử lý string xịn mượt mới, giống với hướng đối tượng hơn so với hướng script như trước, được xây dựng dựa trên những hàm này. Bạn có thể tạo một đối tượng Illuminate\Support\Stringable mới bằng cách sử dụng phương thức Str::of(). Có rất nhiều phương thức có thể sau đó được ghép vào object để xử lý string:

    return (string) Str::of('Laravel Framework 6.x')
                        ->trim()
                        ->replace('6.x', '7.x')
                        ->slug();

Để biết thêm thông tin chi tiết về các phương thức xử lý string khác, vui lòng tham khảo tại tài liệu đầy đủ của nó tại đây.

Cải thiện việc kết nối giữa Route và Model

Các cải thiện về kết nối Route và Model được phát triển bởi Taylor Otwell.

Các khóa tùy biến

Có thể thỉnh thoảng bạn sẽ muốn lấy thông tin của các Eloquent model mà không phải sử dụng trường id. Để làm được điều đó, Laravel 7 cho phép bạn chỉ định trường thông tin cần xét trong phần định nghĩa tham số đường dẫn:

    Route::get('api/posts/{post:slug}', function (App\Post $post) {
        return $post;
    });

Tự động khoanh vùng

Đôi lúc, khi ta định nghĩa cho kết nối ngầm nhiều Eloquent model trong một route, có thể bạn sẽ muốn khoanh vùng cho Eloquent model thứ hai để nó phải là đám con của Eloquent model thứ nhất. Ví dụ, xem xét tình huống sau đây, ta đang lấy bằng trường slug một bài blog được viết bởi một người dùng nào đó:

    use App\Post;
    use App\User;

    Route::get('api/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
        return $post;
    });

Khi sử dụng một kết nối ngầm được đánh khóa tùy biến như là một tham số đường dẫn con, Laravel 7 sẽ tự động khoanh vùng câu query để lấy model con từ cha của chúng, có sử dụng quy ước để đoán mối quan hệ giữa chúng là gì. Trong trường hợp này, có thể giả định rằng model User có một mối quan hệ tên là posts (danh từ số nhiều ở trong tên tham số đường dẫn) cái mà có thể được sử dụng để lấy model Post.

Để thêm thông tin chi tiết về cách kết nối giữa route và model, vui lòng tham khảo tài liệu sau: tài liệu về định tuyến trong Laravel.

Hỗ trợ đa trình điều khiển mail

Hỗ trợ đa trình điều khiển mail được xây dựng bởi Taylor Otwell.

Laravel 7 cho phép cấu hình nhiều “người gửi thư” cho một ứng dụng. Mỗi “người gửi thư” được cấu hình trong file cấu hình mail có thể có các tùy chọn của riêng nó và thậm chí có thể có riêng “người vận chuyển”, cho phép ứng dụng của bạn sử dụng các dịch vụ mail khác nhau để gửi một tập các email nhất định. Ví dụ, ứng dụng của bạn có thể sử dụng Postmark để gửi mail giao dịch trong khi sử dụng Amazon SES để gửi mail hàng loạt.

Mặc định, Laravel sẽ sử dụng “người gửi thư” được cấu hình tại phần default trong file cấu hình mail. Tuy nhiên, bạn có thể sử dụng phương thức mailer để gửi mail bằng cấu hình gửi mail nào đó mà bạn thích.

    Mail::mailer('postmark')
            ->to($request->user())
            ->send(new OrderShipped($order));