+20

Laravel và những tính năng có thể bạn chưa biết ?

Giới thiệu

Laravel hiện tại là một framework PHP rất phổ biển và được sử dụng nhiều trong các dự án. Những tính năng mà nó mang lại rất mạnh mẽ và giúp quá trình phát triển trở nên nhanh chóng hơn rất nhiều. Và trong bài viết lần này, mình sẽ giới thiệu với các bạn một số tính năng của laravel mà có thể bạn chưa biết. Những tính năng này không phải là những tính năng cao siêu hay là những tính năng ẩn, nhưng mình thấy các tính năng này không thường xuyên được sử dụng. Vậy các tính năng đó là gì? Bắt đầu tìm hiểu cùng mình nhé 😄

Laravel features you may not know about

'where' query on a couple of columns

Giả sử bạn muốn thực hiện câu truy vấn sau đây với sql:

SELECT * FROM `users`
WHERE
    `name` = 'phanlyhuynh'
    AND `email` = 'lyhuynh@gmail.com'
LIMIT 1

Bạn có thể thực hiện điều này trong laravel bằng cách gọi method where:

\App\User::whereNameAndEmail('phanlyhuynh','lyhuynh@gmail.com')->first();

và điều quan trọng ở đây là And ở giữa NameEmail. Laravel sẽ tự động tìm ra cột nào mà câu lệnh của bạn đề cập đến
Cũng tương tự như And, bạn cũng có thể thực hiện như vậy với Or:

 \App\User::whereNameOrEmail('huynh','huynh@gmail.com')->get();

Eloquent's find() can accept multiple rows

Eloquent's find() có thể thực hiện trên nhiều row. Bạn có thể sử dụng method find() với nhiều row bằng cách sau đây:

 \App\User::find([1,2,3]);

Nếu find() được truyền vào một mảng, nó sẽ trả về một tập hợp các Eloquent Model row với các id đó (nếu id đó tồn tại)
cũng như find() thì findOrFail() cũng có thể thực hiện như thế. Cả hai, chúng ta chỉ cần gọi findMany() nếu truyền vào một mảng id

Default Model if relationship return null

Mình nghĩ nhiều bạn sẽ biết điều này, nhưng mình chỉ mới phát hiện ra điều này thôi :v
Nếu bạn có một mối quan hệ (belongsTo, MorphOne or HasOne), đôi khi nó có thể trả về null. Trong trường hợp đó, bạn có thể cung cấp giá trị mặc định với phương thức withDefault ().
Nó sẽ tự động tìm ra loại đối tượng sẽ trả về, nhưng bạn cũng có thể đặt một số thuộc tính mặc định.
Sau đây là ví dụ:

public function user()
{
    return $this->belongsTo('App\User')->withDefault();
}
 
    //or
 
public function user()
{
    return $this->belongsTo('App\User')->withDefault([
        'name' => 'Guest Author',
    ]);
}
 
    // or
 
public function user()
{
    return $this->belongsTo('App\User')->withDefault(function ($user) {
        $user->name = 'Guest Author';
    });
}

render() method on Exception

Sử dụng phương thức render() trên Exception để hiển thị phản hồi HTTP cho người dùng. Bạn thực hiện command sau đây để tạo một exception class:

php artisan make:exception --render ExceptionName

Nó sẽ tạo một exception class mới ở trong thư mục Exceptions của bạn, với phương thức render($request)
Nếu một exception được ném vào và xử lý bởi app/Exceptions/Handler.php, nó sẽ kiểm tra bằng phương thức method_exists($exception, 'render'). Nếu nó tồn tại, nó sẽ gọi phương thức đó vào Exception và trả về cho người dùng
Dưới đây là một ví dụ của render() method trong môt Exception, nó sẽ phản hồi view cho người dùng:

/**
* Render the exception into an HTTP response.
*
* @param    \Illuminate\Http\Request
* @return  \Illuminate\Http\Response
*/
public function render($request)
{
    response()->view('errors.myexception', [], 500);
}

Bạn sẽ sử dụng phương thức này để trả về(chẳng hạn như view) sẽ được hiển thị cho người dùng

The cache's rememberForever($key, function() { return 'something'; }) function

Nếu bạn đã sử dụng tính năng cache, khả năng cao bạn sẽ thực hiện như sau :v :

$value = Cache::remember('users', $minutes, function () {
    return DB::table('users')->get();
});

Nhưng bạn cũng có thể thực hiện như sau:

$value = Cache::rememberForever('users', function () {
    return DB::table('users')->get();
});

Điều này sẽ lấy một mục từ cache hoặc lưu trữ giá trị mặc định mãi mãi

Eloquent: get a fresh version (fresh()) of the current model and duplicate rows (replicate())

Sử dụng fresh() để truy vấn database và lấy phiên bản mới của item hiện tại

$user = \App\User::first();
$user->name = "Something new";
$user = $user->fresh(); // chú ý rằng nó sẽ trả về giá trị mới, nó không ảnh hưởng tới model hiện tại
dump($user->name); // nó sẽ trả về tên gốc, gốc phải "Something newm"

Nếu bạn muốn rehydrate model đã tồn tại, chúng ta sử dụng refresh():

 $flight = App\Flight::where('number', 'FR 999')->first();
        $flight->number = 'FR 111';
        $flight->refresh();
        $flight->number; // "FR 999"

Nếu bạn cần sao chép một Eloquent object, hãy sử dụng:

$new = SomeModel::first()->replicate();
$new->save()

Phương thức replicate cho phép bạn cung cấp một mảng các thuộc mà bỏ qua không sao chép, ví dụ:

$new = User::first()->replicate(['password']);
$new->save(); // $new sẽ có tất cả các thuộc tính như first User row, nhưng thuộc tính 'password' sẽ không có

Redirecting URLs from within your routes file (web.php)

Thay vì chuyển hướng ở trong controller, bạn có thể chuyển hướng trực tiếp trong file route:

// Nếu ai đó truy cập vào /here, chúng sẽ trả về đường dẫn HTTP tới /there
Route::redirect('/here', '/there', 301); // 301: di chuyển vĩnh viễn

Lưu ý: thông số thứ ba là tùy chọn và nó mặc định là chuyển hướng 302 (tạm thời).

Fallback Routes

Bạn có thể sử dụng Route::fallback(...), sẽ được sử dụng nếu không có route nào khớp. Điều này thường được sử dụng để hiển thị lỗi 404, nhưng cũng có thể hữu ích trong các tình huống khác

Auth::id()

Mình cũng đã thấy và chính mình cũng rất thường xuyên sử dụng Auth::user()->id, nhưng có cách nhau hơn để thực hiện điều đó là Auth::id() để lấy ID của người dùng (hoặc null nếu không đăng nhập)
Thay vì thực hiện \ Auth :: user (), bạn chỉ có thể thực hiện auth () và sử dụng helper function auth. (Ví dụ đầy đủ: auth () -> id ())

Simple Pagination

Phân trang(Pagination) thông thường sẽ tính tổng số hàng có bao nhiêu và tính số trang tối đa. Trên các tập dữ liệu lớn, đây không phải là một ý tưởng tốt. Simple pagination sẽ chỉ hiển thị một liên kết trước đó và tiếp theo và thực hiện truy vấn nhanh hơn nhiều trên cơ sở dữ liệu của bạn (vì nó không cần tổng số lượng hàng).
Bạn sử dụng nó theo cách tương tự như phân trang Laravel bình thường, nhưng chỉ cần gọi SimplePaginate () thay vì paginate ().

$users = DB::table('users')->simplePaginate(15);

Quickly log things with logger() and info()

Sử dụng info("log some info message")logger("log a debug message"). Nó trông cleaner hơn app('log')->debug($message) or \Log::debug($message)... :v

Set model properties

Trong các Eloquent model của bạn thường chỉ có các thộc tính như: $fillable or $guarded, $casts
Nhưng hiếm khi mình thấy các thuộc tính khác được đặt ở model, như:

  • $perPage: Đặt số lượng hàng (mặc định) trên mỗi trang, khi bạn sử dụng phân trang(Paginate) của Eloquent. Tất nhiên, bạn có thể ghi đè lên điều này trong khi call paginate.
/**
     * The number of models to return for pagination.
     *
     * @var  int
     */
    protected $perPage = 15;
  • $incrementing: Nếu bạn có một bảng không muốn các hàng có ID tăng tự động thì bạn sẽ đặt các mục sau thành false:
/**
     * Indicates if the IDs are auto-incrementing.
     *
     * @var  bool
     */
    public $incrementing = true;

Eloquent Relationships: Only return models if they actually have a relationship row with has()

Nếu bạn có 2 model là Post và Comment. Chúng có quan hệ OneToMany. Nếu bạn muốn lấy tất cả các bài Post với Comment, bạn có thể thực hiện bằng cách:

$postComments = Post::with('comments)->get();

Tuy nhiên, nó sẽ trả về cả các Post mà có 0 comments. Nếu bạn chỉ muốn lấy các Post >0 comments, bạn có thể thực hiện nó với has():

$postComments = Post::with('comments')->has('comments')->get();

Kết luận

Trên đây là một số tính năng mà mình giới thiệu với các bạn. Và những tính năng này chắc chắn sẽ có nhiều bạn sẽ biết một hay nhiều cái mà mình đã giới thiệu và cũng có thể là tất cả. Nhưng có thể một số bạn sẽ tìm thấy được một số tính năng mới từ danh sách trên.
Cảm ơn các bạn đã xem bài viết của mình. Nếu thấy bài viết hữu ích hãy upvote giúp mình nhé 😄 ❤️


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.