Trang chủ Tin Tức

Cập nhật ngay những tính năng mới trong Laravel 8

Cập nhật ngay những tính năng mới trong Laravel 8

Mới đây vào ngày 24/8, sự kiện Laracon mới nhất đã được tổ chức dưới hình thức phát trực tuyến thay vì hội nghị thường niên diễn ra vào mùa hè ở Mỹ. Có 15 diễn giả tham gia thuyết trình tại sự kiện và trong đó, có một diễn giả đặc biệt, được mọi người mong chờ nhất là Taylor Otwell.

Taylor xuất hiện và thông báo về các tính năng mới trong phiên bản tiếp theo của framework - Laravel 8. Anh đi từ những thay đổi nhỏ trước khi giới thiệu sâu vào những cải tiến và tính năng mới sẽ có trên Laravel 8 được phát hành vào 8/9/2020.

Vậy những đổi mới trong Laravel 8 đó là gì?

>> Có thể bạn quan tâm: Laravel là gì? Vì sao Laravel web development là PHP Framework tốt nhất?

Trang đích mới

Khi cài đặt mới , Laravel đã có một nâng cấp cho trang hiển thị khi bạn truy cập trang chủ và được xây dựng với TailwindCSS và có 2 phiên bản light/dark. Đồng thời, có thêm liên kết đến các sản phẩm SaaS khác từ Laravel, cũng như các trang cộng đồng. Ngoài ra, có một số liên kết đến Store Laravel cho bạn dễ dàng đặt mua khi cần.

Thư mục app/models mặc định

Từ phiên bản Laravel 8, tất cả các Models sẽ được mặc định trong thư mục app/models, thay vì phải đặt lại models trong thư mục gốc app. Taylor đã thực hiện một cuộc khảo sát, có hơn 80% các nhà phát triển tự tạo thư mục app/models.

Nếu bạn sử dụng bất kỳ lệnh thủ công nào để tạo ra models, như php artisan make:model - thì nó sẽ tạo cho bạn một model mới bên trong thư mục app/models

Tuy nhiên, nếu bạn muốn giữ các model của mình trong thư mục app và xóa thư mục models mới thì Laravel vẫn sẽ cho phép bạn tạo models trong thư mục app .

Gỡ bỏ Controller namespace prefix

Trong các phiên bản trước của Laravel, có một thuộc tính trong RouteServiceProvider.php gọi là $namespace được sử dụng để làm tiền tố App\Http\Controllers cho namespace của bộ điều khiển một cách tự động. Nếu bạn đang sử dụng callable syntax trong file route web.php, thì Laravel có thể thêm 2 lần tiền tố namespace. Thuộc tính này đã bị xóa trong Laravel 8, vì vậy bạn có thể nhập các lớp controller vào file route mà không gặp vấn đề gì.

Cải thiện route caching

Hy vọng rằng bạn đã tạo route caching trong ứng dụng (bằng lệnh php artisan route:cache tạo tệp PHP với mảng array chứa tất cả các route, sau đó khi người dùng yêu cầu những route nhất định, Laravel sử dụng những route này từ bộ nhớ cache thay vì phải phân tích lại).

Phiên bản Laravel 8 hỗ trợ route caching cho bất kỳ route nào. Thậm chí, nếu route của bạn hay các package mà bạn cài đặt closure hay không.

Thuộc tính Blade component

Như trong Laravel 7, khi muốn mở rộng một Blade component (DangerButton component được extend từ Button component) thì thuộc tính $attributes sẽ không được truyền cho button con. Cái này đã được thay đổi trong bản Laravel 8, tất cả các component con sẽ có sẵn $attributes, giúp việc mở rộng các component dễ dàng hơn.

Cú pháp Event Listener dựa trên Closure rõ ràng hơn

Trong các phiên bản Laravel trước đây, khi đăng ký event listener dựa trên closure, trước tiên bạn phải xác định event class, sau đó đăng ký closure và sau đó type-hint event class cho nó, ví dụ:

Event::listen(OrderShipped::class,function(OrderShipped $event) {

// Do something

});

Trong Laravel 8, bạn có thể bỏ qua bước đầu tiên vì framework có thể suy ra nó từ type-hint:

Event::listen(function(OrderShipped $event) {

// Do something

});

Queueable anonymous event listener

Trong Laravel 8, bạn có thể gửi một job dựa trên closure từ các callback trong model event như:

class User extends Model {

protected static function booting()

{

static::created(queueable(function(User $user) {

// Do something in the background

}))

}

}

 Ở các phiên bản trước, bạn không thể làm như vậy, trừ khi bạn tạo một event class và event listener class, sử dụng ShouldQueue trait. Tính năng mới này giúp bạn làm việc nhanh hơn và cũng chính là hàm namespace đầu tiên được giới thiệu trong framework Laravel, Illuminate\Events\queueable.

Truy cập bí mật: Maintenance mode

Hiện tại, nếu bạn sử dụng các lệnh artisan down/ artisan up để đưa trang web vào trạng thái bảo trì nhưng vẫn cho phép một số người có quyền truy cập (có thể là các nhà phát triển khác …) thì cách duy nhất là thông qua IP whitelisting. Nó sẽ không phù hợp nếu bạn muốn cấp quyền truy cập cho nhiều người hoặc nếu bạn có địa chỉ IP động. Điều này đã được thay đổi trong Laravel 8.

Giờ đây bạn có thể sử dụng "secret flag" để đưa trang web vào chế độ bảo trị, ví dụ:

php artisan down --secret=let-me-in

Lúc này flag secret sẽ trở thành một router mới trong khi trang web đang ở chế độ bảo trì. Nếu sau đó bạn điều hướng đến đó, thì Laravel sẽ tạo một cookie (hướng ứng dụng của bạn bỏ qua chế độ bảo trì khi bạn truy cập nó) và chuyển hướng bạn đến trang chủ của ứng dụng và sau đó sử dụng như bình thường.

>> Có thể bạn quan tâm: Ưu điểm và nhược điểm của Laravel

Trang pre-render trong chế độ bảo trì (Maintenance mode)

Từ Laravel 7 đổ xuống, nếu bạn chạy lệnh php artisan down để đưa trang web vào chế độ bảo trì trong khi deploy và sau đó chạy Composer, ứng dụng có thể sẽ gặp lỗi khi các dependency được thay đổi và các file tự động được ghi. Người dùng có thể nhìn thấy lỗi hiển thị thay vì trạng thái trang bảo trì.

Laravel 8 đã giải quyết được vấn đề này bằng cách chuyển tên của một view tới "render" flag như một phần của câu lệnh artisan down:

php artisan down --render="errors::back-soon"

Laravel sẽ pre-render view này (trong trường hợp này là errors/back-soon.blade.php) và sau đó đưa trang web về chế độ bảo trì. Họ sẽ thấy chế độ xem pre-render - framework sẽ không cố tải file autoload của composer.

Xử lý lỗi queued closure

Đôi khi chúng ta gửi một closure vào hàng đợi cho các tiến trình chạy dưới nền, thì việc xử lý lỗi này khá là khó khăn. Khi đó, các lỗi sẽ được ghi vào bảng failed_jobs trong database, và bạn không thể thực thi bất cứ đoạn code nào sau đó.

Với Laravel 8, bạn có thể đăng ký một callback để chạy khi công việc bị lỗi, thông qua phương thức catch() - tương tự như failed() trong job class tiêu chuẩn. Ví dụ:

dispatch(function() {

// Do something...

})->catch(function(Throwable $e) {

// React to / handle the error

});

Tùy chỉnh thời gian thử lại sau mỗi job failed

Trong Laravel 8, bạn có thể thêm một phương thức backoff() mới vào các Job class của mình để trả về một mảng số nguyên nhằm quyết định thời gian chờ giữa các phiên thử nếu không thành công, ví dụ:

class ExampleJob

{

//

public function backoff()

{

return [1, 5, 10];

}

//

}

Trong ví dụ này, nếu job failed trong lần đầu tiên thì nó sẽ đợi 1s sau để thử lại. Nếu job failed lần 2 thì nó sẽ phải được 5s trước khi thử lại lần 2. Và nếu lần 3 thất bại (hoặc hơn), sẽ phải đợi 10s trước khi được thử lại. Nó sẽ khá hữu ích nếu bạn đang làm việc với một API giới hạn số lượt truy cập để tăng thời gian chờ đợi mỗi khi job failed.

Gửi job batching vào queue

Job batching là một tính năng mới có trong Laravel 8, cho phép bạn gửi nhiều job vào hàng đợi cùng một lúc (trong một batching) để được xử lý đồng thời (nếu bạn có đủ queue workers đang chạy) và đăng ký các callback khi tất cả các job được hoàn thành. Có ba callback có sẵn:

then() - sẽ kích hoạt khi tất cả các công việc trong batching đã hoàn thành thành công.

catch()- sẽ kích hoạt lỗi công việc đầu tiên (nếu có) trong batching.

finally()- sẽ kích hoạt khi tất cả các job batching đã hoàn thành (bao gồm cả thành công hay thất bại)

Tất cả các callback đều có quyền truy cập vào đối tượng $batch, chứa nhiều phương thức khác nhau - chẳng hạn như kiểm tra trạng thái, xác định xem có lỗi không, hủy batch...Điều này cũng có thể được sử dụng trong catch() - để dừng phần còn lại của batch khi gặp lỗi.

Đây là cách bạn có thể sử dụng batch job:

Bus::batch([

new ImportJob(),

new ImportJob(),

new ImportJob(),

new ImportJob(),

new ImportJob(),

])->then(function(Batch $batch){

// All jobs completed successfully

})->catch(function(Batch $batch) {

// First job failure detected

})->finally(function(Batch $batch) {

// All jobs have finished executing

})->dispatch();

Ngoài ra còn có các tính năng nâng cao như khả năng thêm công việc khác vào một batch hiện có từ trong một job có sẵn trong batch đó (thông qua trình $this->batch() ). Nó sẽ có ích khi bạn đang xử lý một lượng lớn dữ liệu và phải làm việc theo nhóm.

Nếu một công việc trong batch của bạn không thành công, phần còn lại của batch sẽ ngừng xử lý và sẽ gọi đối tượng 'catch ()'. Từ bên trong đó, bạn có thể chọn tiếp tục xử lý phần còn lại của batch nếu bạn quyết định lỗi không ảnh hưởng. Ngoài ra, bạn có thể sử dụng  phương thức allowFailures () thay vì phương thức catch () khi gửi batch và nếu có job failed, phần còn lại của batch sẽ tiếp tục xử lý.

Nếu bạn có UUID của batch, có một phương thức khác có sẵn trên Bus - Bus::findBatch($batch_uuid); Thao tác này sẽ trả về một đối tượng chứa thông tin về batch - gồm cả tiến trình hiện tại. Bạn có thể sử dụng nó để hiển thị tiến trình theo thời gian thực của batch trong giao diện người dùng bằng AJAX.

Cải thiện Rate Limiting

Bắt đầu từ Laravel 8, bạn có thể xác định nhiều bộ giới hạn truy cập (Rate Limiter) thông qua một facade mới RateLimiter - đặt tên cho nó và một closure trả về chi tiết của nó.

RateLimiter::for('authentication', function(Request $request) {

return Limit::perMinute(50);

});

Sau đó, Rate limiter có thể sử dụng với phần mềm trung gian hiện có throttle trong file route, nhưng thay vì chuyển một số nguyên, bây giờ bạn có thể chuyển tên Rate Limiter đã xác định.

Route::get('/login')->middleware(['throttle:authentication']);

Điều này sẽ cho phép tối đa 50 yêu cầu đăng nhập trong một phút - đối với tất cả các khách trên trang vì không yêu cầu xác thực.

Vì các rate limiter sử dụng closure, nên bạn có thể viết logic để xác định các điều kiện giới hạn này. Có thể nếu bạn có route /download  để tải file tài liệu, thì bạn có thể cho phép mỗi người dùng đã đăng nhập có thể truy cập không quá một lần/phút, nhưng có nhóm khách hàng cao cấp cần quyền truy cập không giới hạn.

Bạn cũng có thể phân rate limiter theo bất kỳ dữ liệu nào bạn muốn theo địa chỉ IP, ID người dùng hoặc nhóm người dùng.

Kiết xuất database schema

Nếu bạn đang làm việc trên một ứng dụng có số lượng lớn database migration, Laravel 8 có tính năng mới được gọi là schema dumping giúp bạn thu gọn chúng lại. Bạn có thể chạy php artisan schema:dump - sẽ tạo một tệp SQL trong thư mục database/schema, chứa toàn bộ database schema dưới dạng  SQL thô.

Khi bạn chạy php artisan migrate, trước tiên nó sẽ tìm kiếm một file schema để khởi chạy, sau đó file migration chạy như bình thường.

Theo mặc định, chạy lệnh đó sẽ không xóa các file migration sẵn có. Tuy nhiên, nếu bạn thêm flag  --prune vào lệnh, nó sẽ xóa toàn bộ file migration của bạn, và chỉ để lại 1 file duy nhất.

Nếu bạn chạy schema dump, sau đó tạo migration mới, và chạy lại lệnh, nó sẽ nối file migration mới này với file schema hiện có,

Nó được sử dụng cho các hệ cơ sở dữ liệu phổ biến nhất như MySQL, PostgreSQL và SQLite được sử dụng với Laravel - và trong tương lai MSSQL cũng đang được nỗ lực để được hỗ trợ trong Laravel.

Model Factory mới

Tính năng model factory được viết lại hoàn toàn cho Laravel 8, khiến chúng trở nên cực kỳ mạnh mẽ và dễ làm việc hơn. Bây giờ các model factory dựa trên các class, giống như một số package hiện có.

Đối với mỗi Model, bạn có một factory class, ví dụ: UserFactory chứa một definition() trả về một mảng thuộc tính, tương tự như trong Laravel 7 đổ về trước:

class UserFactory extends Factory

{

public function definition()

{

return [

'name' => $this->faker->name,

'email' => $this->faker->safeEmail,

'role' => 'admin',

];

}

}

Các model của bạn sẽ sử dụng trait HasFactory, chứa phương thức factory() trên các model class sẽ trả về một instance của factory class. Trên đó, bạn có thể gọi các phương thức quen thuộc như create() hoặc make()

use App\Models\User;

$fake_user = User::factory()->create();

Tất nhiên, bạn có thể tùy chọn chuyển một mảng thuộc tính mà bạn muốn cung cấp một giá trị cụ thể cho các phương thức đó, như bạn đã làm trong các phiên bản Laravel trước đó.

Bởi vì các factory hiện dựa trên class nên cho một giao diện dễ dùng, ví dụ nếu bạn muốn tạo 10 người dùng:

$fake_users = User::factory()->times(10)->create();

Ngoài ra còn có những cải tiến khác - thay vì dựa trên closure, giờ đây bạn có thể tạo các phương thức tùy chỉnh của riêng mình ngay trên chính factory class. Tất nhiên, bạn có thể viết bất kỳ logic nào bạn muốn (có thể truyền tham số), nhưng đây chỉ là một ví dụ đơn giản về việc ghi đè một thuộc tính:

class UserFactory extends Factory

{

public function withActiveStatus()

{

return $this->state(fn(array $attributes) => [

'status' => 'active',

]);

}

}

Relationship trong model factory cũng được cải thiện đáng kể trong Laravel 8. Ví dụ dưới đây cho thấy tạo một User model có một Order:

$user_with_order = User::factory()

->has(Order::factory())

->create();

Giờ bạn có thể chain các phương thức lại với nhau: 

$user_with_orders = User::factory()

->withActiveStatus()

->has(

Order::factory()

->times(5)

->withStatus('shipped')

->state(function(array $attributes, User $user) {

return ['customer_name' => $user->name];

})

)

->create();

Trong ví dụ trên, chúng ta tạo một User có 5 Order đều có trạng thái "shipped", với thuộc tính customer_name của Order được cài đặt thành tên của fake User mới tạo.

Ngoài ra còn có các magic method để làm việc với các relationship, tức là bạn có thể làm cho code của mình đơn giản hơn nữa. Tiếp tục ví dụ trên, ở đây bạn tạo một User với 3 Order sử dụng magic method:

$user_with_orders = User::factory()

->hasOrders(3)

->create();

Những ví dụ này chỉ đề cập đến relationship "has many", nhưng có rất nhiều phương thức (cả thông thường lẫn magic) có sẵn cho nhiều kiểu relationship khác nhau.

Nếu bạn đang sử dụng các factory trong một project, bạn không phải viết lại sang định dạng mới ngay lập tức - có một package chính thức được viết riêng để hỗ trợ cho định dạng cũ gọi là laravel / inherit-factory. Package này cho phép bạn sử dụng cả factory cũ và mới cùng lúc.

Laravel JetStream và Laravel Fortify

Đây không phải thay đổi cốt lỗi của Laravel 8, nhưng cũng không thể bỏ qua. 

Các phiên bản trước của Laravel có một package được gọi là laravel / ui whcih cung cấp khung xác thực cơ bản cho ứng dụng của bạn đầy đủ frontend (Vue&Bootstrap 4) và backend.

Laravel JetStream - một open source package mới của Laravel 8 mang đến cho bạn một khởi đầu tuyệt vời hơn nữa với các ứng dụng của mình.

Đó là một khung package sẽ thiết lập frontend và backend code hoàn chỉnh cho nhiều chức năng phổ biến trong các ứng dụng web, bao gồm:

. Xác thực (Đăng nhập, truy cập trang dashboard, đăng xuất, cài đặt mật khẩu…)

. Xác thực hai yếu tố (thông qua một ứng dụng như Google Authenticator) mà không cần chỉnh sửa code, bao gồm các tính năng như mã khôi phục

. Quản lý phiên trình duyệt (cho phép người dùng xem họ đã đăng nhập ở đâu và đăng xuất khỏi tất cả các phiên trên trình duyệt khác)

. Quản lý API token cho người dùng được cung cấp bởi Laravel Sanctum, với đầy đủ các quyền có thể tùy chỉnh (tương tự như oAuth scopes)

. Full chức năng "Team" (người dùng có thể tạo nhóm, mời người dùng khác vào nhóm, xem các thành viên khác trong nhóm, quản lý vai trò (và quyền) của các thành viên trong nhóm, chuyển đổi giữa nhiều nhóm…)

. Chỉnh sửa hồ sơ người dùng (cho phép người dùng cập nhật thông tin chi tiết của họ) bao gồm ảnh hồ sơ (dễ dàng bật/tắt trong cấu hình) và thay đổi mật khẩu.

. Xóa chức năng tài khoản.

. Giao diện người dùng được hỗ trợ bởi JavaScript cho các tương tác mượt mà đẹp mắt mà không cần tải lại toàn bộ trang.

. Giao diện người dùng CSS được xây dựng bằng  Tailwind CSS, bao gồm các thành phần từ premium Tailwind UI library, mang lại một giao diện tuyệt vời nhưng vẫn dễ dàng tùy chỉnh.

Khi nói đến phần còn lại của giao diện người dùng, bạn có thể chọn sử dụng Laravel livewire & Alpine.js hoặc Inertia (với Vue.js). Cả hai đều cung cấp cho bạn các tính năng và giao diện người dùng tương tự nhau - chỉ là cho bạn lựa chọn công nghệ ưa thích của mình mà thôi.

Tất cả các thành phần giao diện người dùng (nút, form control, thẻ, modal window..) trong JetStream có thể được sử dụng ở những nơi khác trong ứng dụng của bạn, ngay cả các thành phần tương tác thường yêu cầu JavaScript như modal - giúp bạn tiết kiệm thời gian. Vì nó là một khung package (các tệp được publish lên ứng dụng của bạn), bạn có toàn quyền kiểm soát việc tùy chỉnh.

Đây thực sự là một bổ sung lớn cho hệ sinh thái Laravel - nó giúp các nhà phát triển tiết kiệm rất nhiều thời gian và cho họ tập trung vào việc viết logic các chức năng khác trong ứng dụng.

Laravel JetStream sẽ là một package mã nguồn mở, miễn phí và sẽ được phát hành cùng thời điểm với Laravel 8 - ngày 08/09/2020.

Tham khảo Georgebuckingham.com

>> Có thể bạn quan tâm: Thử cài đặt môi trường docker cho laravel

BizFly Cloud là nhà cung cấp đa dịch vụ với chi phí thấp nhất thị trường trong lĩnh vực điện toán đám mây, được vận hành bởi VCCorp.

BizFly Cloud là một trong 4 doanh nghiệp nòng cốt trong "Chiến dịch thúc đẩy chuyển đổi số bằng công nghệ điện toán đám mây Việt Nam" của Bộ TT&TT; đáp ứng đầy đủ toàn bộ tiêu chí, chỉ tiêu kỹ thuật của nền tảng điện toán đám mây phục vụ Chính phủ điện tử/chính quyền điện tử.

Độc giả quan tâm đến các giải pháp của BizFly Cloud có thể truy cập tại đây.

DÙNG THỬ MIỄN PHÍ tại: https://manage.bizflycloud.vn/