Các tính năng mới của laravel 5.5 (p1)

Lời nói đầu.

Phiên bản laravel 5.5 mới nhất vừa mới được release xong, trong phiên bản mới này có cập nhật kha khá các chức ngăng mới. Ngày hôm nay mình xin phép nói về các new feature mà mình cảm thấy thú vị trong bài viết này .

Nội dung

1, Có thêm các option cho route

  • Route::view('/welcome', 'welcome') : Option này cho phép render thằng từ view.
  • Route::redirect('home', 'dashboard') : Option này cho phép tự động chuyển sang trang dashboard khi vào url là home

2, Mở rộng câu lệnh if trong blade .

Trong các phiên bản cũ, khi sử dụng if trong blade bạn hoàn toàn phải viết cụ thể điều kiện ra (có thế nó rất lằng nhằng) . Điều này quả thật là 1 việc khá khó chịu và gây làm code trở nên dài dòng khó hiểu.

Thật là may vì với phiên bản 5.5 lần này, laravel đã mở rộng chức năng của if bằng cách tạo ra các câu lệnh cụ thể hơn. Bằng cách vào AppServiceProvider và tạo thêm các điều kiện cụ thể . Ví dụ

 Blade::if('env', function ($environment) {
       return app()->environment($environment);
   });

Và khi ở view để sử dụng chúng bạn chỉ cần dùng như sau $env('locale') \\ @endenv

3, Kiểm tra nội dung mail một cách trực tiếp .

Trong các phiên bản trước, việc check xem bố cục mail lúc nào cũng là 1 sự khó chịu với các nhà phát triển . Chúng ta cần gửi thử 1 mail đi và vào mail đó để xem như thế nào. Thật phiền phức.

Rất may trong phiên bản mới lần này, laravel đã khắc phục điều đó bằng cách có thể render trực tiếp ra bố cục mail thông qua router . Cụ thể như sau :

  • Đầu tiên bạn cần tạo ra 1 mailable trong project của mình bằng cách : php artisan make:mail Welcome

  • Sau đó trong route cần khai báo như sau :

Route::get('/email', function () {
    return new App\Mail\Welcome();
});

4 : Xử lý sâu hơn khi có exception

Trong phiên bản mới này , laravel đã đi sâu vào việc xử lý exception khi chúng xảy ra . Bẳng cách mở rộng thêm 2 function trong class, cụ thể như sau :

<?php

namespace App\Exceptions;

use Exception;

class RenderException extends Exception
{
    /**
     * Report the exception.
     *
     * @return void
     */
    public function report()
    {
        // some ever
    }

    /**
     * Render the exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request
     * @return \Illuminate\Http\Response
     */
    public function render($request)
    {
        return response(...);
    }
}
  • report : Hàm này để developer log lại khi exception xảy ra, tùy vào từng dev sẽ muốn làm gì trong function này ... Tùy vào từng trường hợp ví dụ là lưu log , rollback data, báo notification hay không làm gì cả .
  • render : Khi hàm này được gọi nó sẽ trực tiếp trả ra cho bạn những gì được cấu hính trong class, và đương nhiên là luồng dữ liệu đang chạy của bạn sẽ bị ngừng lại.

Hàm này khá là tiện dụng tuy nhiên trong 1 số trường hợp bạn không muốn report khi xảy ra lỗi, trong trường hợp này bạn cần vào App\Exceptions\Handler và add vào mảng :

protected $dontReport = [
        \Illuminate\Auth\AuthenticationException::class,
        \Illuminate\Auth\Access\AuthorizationException::class,
        \Symfony\Component\HttpKernel\Exception\HttpException::class,
        \Illuminate\Database\Eloquent\ModelNotFoundException::class,
        \Illuminate\Session\TokenMismatchException::class,
        \Illuminate\Validation\ValidationException::class,
    ];

Đôi khi bạn không muôn gây ảnh hưởng đến luồng làm việc của bạn mà chỉ muốn report lại lỗi thì có thể dùng helper report(). Cụ thể như sau :

public function isValid($value)
{
    try {
        // Validate the value...
    } catch (Exception $e) {
        report($e);

        return false;
    }
}

5: Responsable interface

Trong version mới lần này có xuất hiện thêm 1 khái niệm mới khá thú vị đó là Responsable interface ... Với khái niệm mới này có vẻ như những nhà sáng lập của laravel đang tiếp tục tách nhỏ các 1 process của laravel ...

Responsable interface cho phép chúng ta tạo ra 1 class với mục đích chuyên môn hóa cho việc response ra những gì.

class Thing implements Responsable
{
    public function toResponse()
    {
        return 'This is a great response! ' . $this->id;
    }
}

Muốn xem cụ thể chúng hoạt động ntn bạn có thể xem tại đây để có 1 cái nhìn rõ nét nhất về khái niệm này.

6 : Validation improvements

Trong các phiên bản cũ hơn, laravel đã support các nhà phát triển về việc custom các validate rule bằng cách extend các validate rule vào file AppServiceProvider ... Việc này tuy tiện dụng nhưng gây ra sự nặng nề cho file AppServiceProvider . Để khắc phục điều này , trong version mới , laravel đã hỗ trợ việc tự tạo ra các class rule riêng để các nhà phát triển tiện sử dụng.

  • Để tạo 1 class rule bạn chỉ cần : php artisan make:rule NewRule

  • Class này sẽ có 2 phần chính là

 /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        return strtoupper($value) === $value;
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The :attribute must be uppercase.';
    }
  • Khi validate bạn chỉ cần khai báo như sau :
$this->validate([
    'myfield' => [
        'string',
        'required',
        new App\Rules\NewRule
    ]
);

Kết Luận.

Laravel 5.5 hiện còn rất nhiều feature mới mà mình vì thời gian có hạn chưa trình bày trong bài viết trên ... Mình xin phép trình bày chúng trong các bài viết lần sau. Thân !

Tài liệu tham khảo

Laracast Sitepoint Laravel Documment

All Rights Reserved