Contract công cụ lợi hại không kém của Laravel

29th Oct 2022
Contract công cụ lợi hại không kém của Laravel
Table of contents

CONTRACT LÀ GÌ?

Laravel’s Contracts are a set of interfaces that define the core services provided by the framework.

Sau một hồi ngó qua repo contract của laravel trên Github, ta có thể dễ dàng nhận ra bản chất thực sự của những cái “hợp đồng” contract này là những Interface, dưới đây là một ví dụ rất cụ thể về Contract Mail của Laravel.

ƯU ĐIỂM CỦA CONTRACT.

Vì bản chất là Interface nên khi sử dụng loại Contract, các bạn sẽ có được 2 ưu điểm của Interface đó là loose coupling và simplicity.

Loose coupling.

Như các bạn đã biết thì Laravel, với sức mạnh của Service Container sẽ có thể tự động resolve ra một instance $mailer cho chúng ta. Nhưng vấn đề là chúng ta đang type-hint một Interface (Contract), chứ không phải là một class cụ thể. Thực tế logic của chúng ta cũng không cần biết và quan tâm đến cái class gửi mail nó là class gì, hay nó đã làm thế nào để có thể gửi mail. Cái duy nhất logic của ta quan tâm là nó cần một instance có thể gửi mail để hoạt động. Đó là instance của class nào không quan trọng, miễn là class đó có implement interface Illuminate\Contracts\Mail\Mailer.

<?php

namespace Illuminate\Contracts\Mail;

interface Mailer
{
    /**
     * Begin the process of mailing a mailable class instance.
     *
     * @param  mixed  $users
     * @return \Illuminate\Mail\PendingMail
     */
    public function to($users);

    /**
     * Begin the process of mailing a mailable class instance.
     *
     * @param  mixed  $users
     * @return \Illuminate\Mail\PendingMail
     */
    public function bcc($users);

    /**
     * Send a new message with only a raw text part.
     *
     * @param  string  $text
     * @param  mixed  $callback
     * @return \Illuminate\Mail\SentMessage|null
     */
    public function raw($text, $callback);

    /**
     * Send a new message using a view.
     *
     * @param  \Illuminate\Contracts\Mail\Mailable|string|array  $view
     * @param  array  $data
     * @param  \Closure|string|null  $callback
     * @return \Illuminate\Mail\SentMessage|null
     */
    public function send($view, array $data = [], $callback = null);
}

Một đoạn giải thích ngắn gọn vừa đủ để ta thấy được một ưu điểm của Contract (thực ra là Interface)

Contracts

Simplicity.

When all of Laravel’s services are neatly defined within simple interfaces, it is very easy to determine the functionality offered by a given service. The contracts serve as succinct documentation to the framework’s features.

In addition, when you depend on simple interfaces, your code is easier to understand and maintain. Rather than tracking down which methods are available to you within a large, complicated class, you can refer to a simple, clean interface.

Đó đọc hết đoạn ngắn tũn này của document cùng với ví dụ về Contract Mail phía trên, chúng ta thấy việc sử dụng các Interface đơn giản (chỉ từ 2 đến vài function) thì việc đọc code rất dễ hiểu và từ đó công cuộc maintain, bảo trì cũng sẽ dễ thở hơn rất nhiều.

Tóm lại, sử dụng Contract trong khi code chính là dùng Interface. Mà dùng Interface thì lại dễ code hơn khi mở rộng, dễ đọc code, dễ bảo trì. Đó chính là ưu điểm mà Contract mang lại.

Bạn thấy bài viết này như thế nào?
1 reaction

Add new comment

Image CAPTCHA
Enter the characters shown in the image.

Related Articles

Mỗi kết nối cơ sở dữ liệu được định nghĩa trong một mảng, với tên kết nối là khóa của mảng

Eager Loading là một kỹ thuật tối ưu hóa truy vấn cơ sở dữ liệu trong Laravel, giúp tăng tốc độ truy vấn và giảm số lượng truy vấn cần thiết để lấy dữ liệu liên quan đến một bản ghi.

Để sử dụng Eager Loading với điều kiện trong Laravel, bạn có thể sử dụng phương thức whereHas hoặc orWhereHas trong Eloquent Builder.

E hiểu đơn giản vầy nha. auth() hay Auth trong laravel là những function global hay class, nó cũng chỉ là 1 thôi

Xin chào các bạn, tuần này mình sẽ viết một bài về cách xử lý Real Time(thời gian thực) với Laravel và Pusher