Laravel - Contracts: A Beginner's Guide

Xin chào các Laravel wizard tương lai! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị vào thế giới của Laravel Contracts. Đừng lo lắng nếu bạn mới bắt đầu học lập trình - tôi sẽ là người hướng dẫn thân thiện của bạn, và chúng ta sẽ cùng nhau từng bước. Cuối cùng của bài hướng dẫn này, bạn sẽ có một sự hiểu biết vững chắc về Laravel Contracts là gì và chúng có thể làm cho ứng dụng Laravel của bạn trở nên linh hoạt và mạnh mẽ hơn.

Laravel - Contracts

What Are Laravel Contracts?

Hãy tưởng tượng bạn đang xây dựng một cấu trúc Lego khổng lồ. Có phải sẽ rất tuyệt nếu bạn có thể dễ dàng thay thế một số mảnh mà không làm toàn bộ cấu trúc bị sụp đổ? Đó chính là điều mà Laravel Contracts cho phép chúng ta làm với mã của mình!

Trong thuật ngữ kỹ thuật, Laravel Contracts là một bộ các giao diện định nghĩa các dịch vụ cốt lõi được cung cấp bởi khung công tác. Chúng đóng vai trò như một "hợp đồng" giữa bạn và khung công tác, đảm bảo rằng một số phương thức luôn khả dụng, không phụ thuộc vào việc triển khai cụ thể nào.

Why Use Contracts?

  1. Flexibility: Contracts giúp dễ dàng thay thế các thành phần của ứng dụng của bạn.
  2. Clarity: Chúng cung cấp một API rõ ràng và ngắn gọn cho các tính năng của khung công tác.
  3. Testability: Contracts giúp dễ dàng viết các bài kiểm tra đơn vị cho mã của bạn.

Hãy cùng đi sâu hơn với một số ví dụ!

Your First Contract: Cache

Một trong những Contract phổ biến nhất trong Laravel là Cache Contract. Hãy cùng xem chúng ta có thể sử dụng nó như thế nào:

use Illuminate\Contracts\Cache\Repository as Cache;

class UserController
{
protected $cache;

public function __construct(Cache $cache)
{
$this->cache = $cache;
}

public function showProfile($id)
{
$user = $this->cache->remember('user.'.$id, 3600, function() use ($id) {
return User::find($id);
});

return view('user.profile', ['user' => $user]);
}
}

Trong ví dụ này, chúng ta sử dụng Cache Contract để lưu trữ và检索 thông tin người dùng. Hãy phân tích nó:

  1. Chúng ta导入 Cache Contract với use Illuminate\Contracts\Cache\Repository as Cache;
  2. Trong constructor, chúng ta đang tiêm một instance của Cache Contract.
  3. Trong phương thức showProfile, chúng ta sử dụng phương thức remember để hoặc lấy người dùng từ cache, hoặc nếu không tồn tại, fetch nó từ cơ sở dữ liệu và lưu trữ nó trong cache trong một giờ (3600 giây).

Sự đẹp đẽ của việc sử dụng Contract ở đây là chúng ta không cần lo lắng về việc triển khai cụ thể của caching. Nó có thể sử dụng Redis, Memcached, hoặc thậm chí là caching dựa trên file - mã của chúng ta vẫn không thay đổi!

The Power of Dependency Injection

Bạn có thể đã nhận thấy rằng chúng ta không tự tạo instance của Cache. Thay vào đó, chúng ta yêu cầu nó trong constructor. Đây được gọi là Dependency Injection, và nó là một khái niệm quan trọng trong Laravel.

Khi Laravel tạo một instance của UserController, nó thấy rằng chúng ta yêu cầu một Cache trong constructor. Laravel sau đó tra cứu哪种具体实现它应该用于 Cache Contract và tự động cung cấp nó cho controller của chúng ta.

Điều này làm cho mã của chúng ta trở nên linh hoạt hơn và dễ dàng kiểm tra hơn. Chúng ta có thể dễ dàng thay thế việc triển khai cache trong các bài kiểm tra của mình mà không cần thay đổi mã của controller!

Common Laravel Contracts

Laravel cung cấp nhiều Contract sẵn có. Dưới đây là một số Contract phổ biến nhất:

Contract Description
Cache Cung cấp các phương thức cho việc caching dữ liệu
Queue Cho phép bạn hoãn xử lý các nhiệm vụ tốn thời gian
Auth Xử lý xác thực và ủy quyền
Mail Cung cấp các phương thức để gửi email
Filesystem Cung cấp một API thống nhất để làm việc với bộ nhớ đệm local và cloud

Creating Your Own Contracts

Khi bạn trở nên thoải mái hơn với Laravel, bạn có thể muốn tạo ra Contract của riêng mình. Hãy tạo một Contract đơn giản cho một dịch vụ thời tiết giả định:

// app/Contracts/WeatherService.php
namespace App\Contracts;

interface WeatherService
{
public function getCurrentTemperature(string $city): float;
public function getForecast(string $city, int $days): array;
}

Bây giờ chúng ta có thể tạo một việc triển khai của Contract này:

// app/Services/OpenWeatherMapService.php
namespace App\Services;

use App\Contracts\WeatherService;

class OpenWeatherMapService implements WeatherService
{
public function getCurrentTemperature(string $city): float
{
// Implementation using OpenWeatherMap API
}

public function getForecast(string $city, int $days): array
{
// Implementation using OpenWeatherMap API
}
}

Để sử dụng điều này trong ứng dụng của chúng ta, chúng ta sẽ liên kết việc triển khai của mình với Contract trong một service provider:

// app/Providers/AppServiceProvider.php
use App\Contracts\WeatherService;
use App\Services\OpenWeatherMapService;

public function register()
{
$this->app->bind(WeatherService::class, OpenWeatherMapService::class);
}

Bây giờ, bất kỳ nơi nào trong ứng dụng của chúng ta cần dữ liệu thời tiết, chúng ta chỉ cần type-hint Contract WeatherService:

use App\Contracts\WeatherService;

class WeatherController
{
protected $weather;

public function __construct(WeatherService $weather)
{
$this->weather = $weather;
}

public function index(Request $request)
{
$temperature = $this->weather->getCurrentTemperature($request->city);
return view('weather', ['temperature' => $temperature]);
}
}

Sự đẹp đẽ của cách tiếp cận này là nếu chúng ta sau này quyết định chuyển sang một API thời tiết khác, chúng ta chỉ cần tạo một việc triển khai mới và cập nhật service provider của mình. Phần còn lại của mã ứng dụng của chúng ta sẽ không thay đổi!

Conclusion

Chúc mừng! Bạn đã bước những bước đầu tiên vào thế giới của Laravel Contracts. Chúng ta đã覆盖 Contract là gì, tại sao chúng hữu ích, và cách sử dụng chúng trong các ứng dụng Laravel của bạn. Chúng ta thậm chí đã tạo ra Contract và việc triển khai của riêng mình!

Nhớ rằng, Contract là tất cả về việc định nghĩa một API rõ ràng cho các thành phần của ứng dụng bạn. Chúng làm cho mã của bạn trở nên linh hoạt hơn, dễ hiểu hơn và dễ kiểm tra hơn. Khi bạn tiếp tục hành trình Laravel của mình, bạn sẽ tìm thấy nhiều cách hơn để sử dụng Contract để xây dựng các ứng dụng vững chắc, dễ bảo trì.

Tiếp tục luyện tập, giữ sự tò mò, và trước khi bạn biết, bạn sẽ trở thành chuyên gia Laravel Contract! Chúc bạn vui vẻ khi编码!

Credits: Image by storyset