Macro và Mixin
Trong SkillDo CMS (tương tự như Laravel Framework), Macro và Mixin là những công cụ vô cùng mạnh mẽ cho phép bạn có thể tự động "nhúng" thêm các phương thức (method) mới vào một Class Core có sẵn của hệ thống mà không hề yêu cầu bạn phải sửa đổi trực tiếp mã nguồn gốc của Class đó.
Tính năng này được hỗ trợ bởi Trait Illuminate\Support\Traits\Macroable và có mặt rải rác trên rất nhiều Class tiện ích toàn cục (Ví dụ: Arr, Str, Admin, Auth, Theme, Url,...).
1. Macro (Thêm Từng Phương Thức)
Macro là một cách để định nghĩa và chèn thêm một function riêng lẻ vào một lớp có sử dụng Macroable. Thông thường bạn sẽ đăng ký Macro ở bên trong hàm boot() của một Service Provider.
Định nghĩa một Macro
Đề khởi tạo phương thức bằng Macro, bạn gọi phương thức tĩnh macro truyền vào 2 tham số: Tên phương thức mong muốn và một Closure (hàm ẩn danh) thực thi logic.
Ví dụ: Tiêm thêm method toUpper() vào mảng helper Core Arr:
namespace MyPlugin\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Arr;
class MyPluginServiceProvider extends ServiceProvider
{
public function boot()
{
// Khai báo tiêm method toUpper vào Str/Arr
Arr::macro('toUpper', function ($array) {
return array_map(function ($value) {
return is_string($value) ? strtoupper($value) : $value;
}, $array);
});
}
}
Cách Sử Dụng Macro
Sau khi đã đăng ký xong ở Service Provider, hệ thống sẽ tự động liên kết (bind) phương thức này vào Class Arr. Trong code toàn dự án, bạn có thể gọi thẳng Macro mới tạo y như thể nó là hàm mặc định của Frameowrk:
use Illuminate\Support\Arr;
$array = ['first', 'second', 'third'];
// Phương thức toUpper() không có trong code gốc, nhưng giờ nó hoạt động!
$upper = Arr::toUpper($array);
// Kết quả Output: ['FIRST', 'SECOND', 'THIRD']
2. Mixin (Thêm Hàng Lo ạt Phương Thức)
Nếu Macro chỉ đóng vai trò chèn 1 hàm ẩn danh, thì Mixin là một kỹ thuật bao bọc cho phép bạn viết toàn bộ nhiều phương thức thành một Class độc lập, sau đó gộp tất cả Method trong nó nhồi nhét chung vào một Class gốc. Điều này giúp mã của bạn sạch sẽ và chia sẻ tài nguyên linh hoạt hơn nhiều.
Định Nghĩa Class Dành Cho Mixin
Tạo ra một Class độc lập chỉ chứa các function trả về các Closure ẩn danh. (Bắt buộc phải return Callback chứa Logic thao tác).
namespace MyPlugin\Supports;
class StringHelpers
{
// Phương thức sẽ đẻ ra Str::toSnake()
public function toSnake() {
return function ($value) {
return strtolower(preg_replace('/\s+/', '_', $value));
};
}
// Phương thức sẽ đẻ ra Str::toKebab()
public function toKebab() {
return function ($value) {
return strtolower(preg_replace('/\s+/', '-', $value));
};
}
}