Giap Hiep

I'm Giap Hiep

I'm a web developer, a gymer. I enjoy share something i know that help people's work!
Giap Hiep

Sắp ra mắt Laravel 7.x có gì mới?

Chỉ còn vài tuần nữa là bản phát hành Laravel 7 ra mắt, vì vậy mình đã tập hợp một danh sách một số tính năng và thay đổi mới quan trọng. Tất nhiên đây không phải là tất cả nhưng nó là một tổng quan ngắn gọn về một số nội dung mới.

Thêm "subquery value" trong câu lệnh where

Giả sử bạn có một ứng dụng olympics theo dõi tất cả các vận động viên và huy chương của họ. Giả sử bạn muốn tìm tất cả các vận động viên có huy chương mới nhất là huy chương vàng. Đây là cách bạn có thể làm điều đó bằng tính năng mới này:

$athletes = Athlete::where(function ($query) {
    $query->select('type')
        ->from('medals')
        ->whereColumn('athlete_id', 'athletes.id')
        ->orderByDesc('awarded_date')
        ->limit(1);
}, 'Gold')->get();

Trước đây method where với tham số thứ nhất là 1 cột trong table, thì giờ đây nó có thể là 1 subquery (1 column của bảng khác liên kết)

Thêm Collection::sortDesc()

Laravel hiện tại chỉ có sort mà không có sortDesc nên đây là method mới, cách hoạt động giống với sort() chỉ là nghịch đảo.

$collection = collect([5, 3, 1, 2, 4]);

$sorted = $collection->sortDesc();

$sorted->values()->all();

// [5, 4, 3, 2, 1]

Thêm HandleCors middleware

Sẽ có 1 middleware mặc định mới tên là HandleCors sử dụng package mặc định luôn https://github.com/fruitcake/laravel-cors dùng để cho phép bạn gửi Cross-Origin Resource Sharing headers.

Cho phép Collection::push nhận nhiều giá trị đầu vào

Hiện tại collection push chỉ nhận 1 giá trị đầu vào, phiên bản 7x sẽ nhận nhiều hơn là 1

$collection->push(5);
$collection->push('string')
$collection->push(['a', 'b', 'c'])
$collection->push(['x' => 'a', 'y' => 'b', 'z' => 'c'])
// push multiple items as parameters
$collection->push($item, $anotherItem, $thirdItem);

// push multiple items from array
$collection->push(...$itemsArray);

// we can even pass another collection without ->toArray()
$collection->push(...$itemsCollection);

// and our push can be empty as well
$collection->push();
$collection->push(...[]);

Tùy chỉnh Cast Types

Hiện tại với $casts thì chỉ dùng được các loại đã được định sẵn, phiên bản 7x bạn có thể tùy chỉnh nó theo ý mình. Object cast phải implements

Illuminate\Contracts\Database\Eloquent\CastsAttributes là contract của CastsInboundAttributes

<?php

use Illuminate\Contracts\Database\Eloquent\CastsAttributes;

class AddressCaster implements CastsAttributes
{
    public function get($model, $key, $value, $attributes)
    {
        return new Address(
            $attributes['address_line_one'], 
            $attributes['address_line_two']
        );
    }

    public function set($model, $key, $value, $attributes)
    {
        return [
            'address_line_one' => $value->lineOne, 
            'address_line_two' => $value->lineTwo
        ];
    }
}

Không còn hỗ trợ Monolog v1

Đơn giản là có Monolog v2 rồi nên không support nữa.

Implicit Route Model Binding dễ dàng hơn

Nếu các bạn biết đến tính năng Route Model Binding trong Laravel thì model sẽ tự động Binding vào controller dựa vào controller

Route::get('/posts/{post}', function (Post $post) {
    // ...
});

Khi bạn muốn bind theo id, khi thì bind theo slug thì bạn phải custom trong model bằng

<?php

class Post extends Model
{
    /**
     * Get the route key for the model.
     *
     * @return string
     */
    public function getRouteKeyName()
    {
        return 'slug';
    }
}

Ở phiên bản 7x này sẽ dễ dàng hơn

// bind theo slug ở ngoài front-end
Route::get('/posts/{post:slug}', function (Post $post) {
    // ...
});

// bind theo id ở trong admin panel
Route::get('/admin/posts/{post:id}/edit', function (Post $post) {
    // ...
});

Ra mắt gói Laravel Airlock

Mình có đăng 1 bài giới thiệu ở page Laravel Việt Nam: https://www.facebook.com/LaravelVietNam

Laravel Airlock một official package mới do Laravel phát triển.

Laravel Airlock cung cấp một hệ thống xác thực (authentication system) cực kì nhẹ cho website SPA và simple API.

Lí do ra đời Airlock:

  1. Các giải pháp cho SPA Authentication hiện nay đều cố lưu trữ token của người dùng ở dưới local, điều đó đồng nghĩa với việc lỗ hổng XSS sẵn sàng chờ chực và đọc lấy chúng.

  2. Nếu sử dụng Passport và bạn chỉ dùng để chứng thực thì k khác gì dùng dao mổ trâu đi giết gà.

  3. Nếu ở trên Passport quá nặng, người ta sẽ nghĩ đến 1 gói nhỏ hơn để giải quyết vấn đề này đó là JWT, bằng cách đơn giản cung cấp 1 token cho bên thứ ba, và nó hoàn toàn riêng biệt và không có gì để làm với OAuth cả.

Nếu đang xây dựng website SPA Laravel bạn cân nhắc dùng gói này nhé. Thời điểm đăng vẫn còn quá sớm để công khai, nhưng ad giới thiệu trước để các bạn tìm hiểu.

https://github.com/laravel/airlock

Multiple Mailers

Hiện tại Laravel có multi database, multi log, multi session, multi broadcast,... chỉ chưa có multi mailers.

Mailer nó là dạng singleton trong container nên dù bạn có change config mailer cũng k thay đổi gì cả, phải custom rất mệt.. nên có thể nói tính năng này rất hữu ích

Mail::to('taylor@laravel.com')->send(new Mail);

Mail::mailer('other-mailer')->to('taylor@laravel.com')->send(new Mail);

Cấu hình multi mailers sẽ có trong file config mail.php trong phiên bản 7x

Template mail/notification mới

Trông sẽ như thế này

Auth mặc định sẽ return API style khi nhận XHR Requests

Điều này cập nhật xác thực build sẵn để trả về response 2xx khi bình thường (hoặc 4xx khi xác thực) trên các yêu cầu XHR thay vì trả lại chuyển hướng và thao tác phiên, v.v.

Nâng cấp lên Symfony 5

Laravel dùng đồ mới thôi nên không có gì để bàn.