Laravel 13 hiện cho phép bạn thay thế các thuộc tính $table, $fillable và $casts vốn thường làm dày đặc hầu hết các model bằng các PHP attributes (thuộc tính) gốc. Thay đổi này áp dụng cho hơn một tá tính năng của framework, từ cấu hình model đến event listeners và mailables, và nó hoạt động mà không làm phá vỡ mã nguồn hiện có.
Tại sao Laravel thêm các native attributes
Từ lâu, Laravel đã dựa vào các “magic strings” – các mảng chứa tên cột hoặc các trường ẩn nằm ở đầu một class model. Những mảng này không cung cấp gợi ý nào cho IDE về schema bên dưới, vì vậy việc đổi tên cột có thể bị bỏ sót mà không được chú ý. Bằng cách chuyển cấu hình vào mã nguồn có kiểu dữ liệu (typed code) thực thụ, Laravel giúp các nhà phát triển tập trung thân class vào logic nghiệp vụ, đồng thời cho phép trình soạn thảo hiển thị các công cụ tự động hoàn thành (autocomplete), kiểm tra kiểu (type-checking) và đổi tên (rename-refactor).
Framework đọc các attributes thông qua PHP’s reflection API và lưu kết quả vào cache, vì vậy chi phí vận hành (runtime overhead) gần như bằng không. Các model dựa trên property hiện tại vẫn tiếp tục hoạt động chính xác như hiện nay, nghĩa là bạn có thể áp dụng cú pháp mới một cách dần dần.
Những gì bạn nhận được
- Cấu hình có kiểu dữ liệu (Typed configuration) – Các attributes chấp nhận các đối số có kiểu dữ liệu, loại bỏ các magic strings. Khi đổi tên một cột, IDE sẽ chỉ ra mọi nơi bạn cần cập nhật.
- Thân class sạch sẽ hơn – Tất cả cấu hình nằm phía trên tên class; phần thân chỉ chứa các relationships, scopes và methods.
- Trải nghiệm IDE tốt hơn – Tính năng autocomplete và phân tích tĩnh (static analysis) hoạt động trên các đối số của attribute, điều mà các mảng chuỗi (arrays of strings) không thể làm được.
- Không có thay đổi gây lỗi (No breaking changes) – Laravel đọc cả các property cũ và các attribute mới, vì vậy một codebase hỗn hợp vẫn chạy mà không gặp vấn đề gì.
Hướng dẫn di chuyển từng bước
Xác định model cần di chuyển
Mở file model. Nếu mười mấy dòng đầu tiên bị chiếm bởi$table,$fillable,$hiddenhoặc phương thứccasts(), đó là một ứng viên tiềm năng.Thêm các attribute classes
Ở đầu file, hãy import các attribute classes tương ứng với các property mà bạn sẽ thay thế (ví dụ:Table,Fillable,Casts). Laravel cung cấp sẵn các attributes này.Thay thế khai báo property bằng attributes
// Before protected $table = 'site_deployments'; protected $fillable = ['site_id', 'server_id', 'status']; protected function casts(): array { return ['is_rollback' => 'boolean']; }// After #[Table('site_deployments')] #[Fillable(['site_id', 'server_id', 'status'])] #[Casts(['is_rollback' => 'boolean'])] class Deployment extends Model { // business logic only }Cú pháp attribute nằm ngay phía trên khai báo class. Hãy xóa property hoặc method gốc sau khi đã xác nhận attribute hoạt động bình thường.
Chạy bộ test (test suite)
Xác minh rằng mass-assignment, serialization và bất kỳ custom casting nào vẫn hoạt động như trước. Việc xử lý attribute của Laravel được lưu vào cache, vì vậy một test thất bại thường chỉ ra lỗi đánh máy trong các đối số của attribute.Commit và triển khai theo từng đợt nhỏ
Đẩy model đã di chuyển lên một feature branch, merge nó sau khi CI pipeline vượt qua, và triển khai cho một nhóm máy chủ nhỏ. Vì cú pháp property cũ vẫn được hỗ trợ, bất kỳ tham chiếu lạc lõng nào cũng sẽ không gây ra lỗi runtime.Lặp lại theo từng namespace
Thay vì viết lại toàn bộ codebase cùng một lúc, hãy chuyển một nhóm model logic (ví dụ: tất cả các thực thể liên quan đến thanh toán) sang attributes, sau đó lặp lại cho nhóm tiếp theo. Điều này giúp hạn chế phạm vi ảnh hưởng (blast radius) của bất kỳ lỗi hồi quy (regression) nào.
Công cụ và các biện pháp an toàn
- Rector – Một công cụ refactoring tự động có thể chuyển đổi cú pháp property lặp đi lặp lại thành các attributes. Hãy chạy nó trên một bản sao của codebase, xem xét sự khác biệt (diff) và áp dụng các thay đổi trông có vẻ chính xác.
- Automated tests – Các tiện ích kiểm thử tích hợp sẵn của Laravel giúp phát hiện các sai lệch trong mass-assignment và đầu ra JSON. Hãy giữ cho chúng luôn "xanh" (pass) sau mỗi bước di chuyển.
- Feature flags – Nếu bạn cần rollback nhanh chóng, hãy bao bọc việc sử dụng attribute mới sau một flag để chuyển đổi giữa cấu hình cũ và mới.
Khi nào bạn có thể bỏ qua việc di chuyển
Nếu một dự án nhỏ, ổn định và hiếm khi được chạm tới, lợi ích của việc có các model sạch sẽ hơn có thể không bù đắp được công sức chuyển đổi. Cú pháp attribute là tùy chọn; bạn có thể tiếp tục sử dụng cách tiếp cận property cổ điển vô thời hạn. Ngược lại, đối với các ứng dụng đang phát triển tích cực, đặc biệt là những ứng dụng có model lớn hoặc thay đổi schema thường xuyên, việc áp dụng attributes sớm sẽ giảm bớt sự khó khăn trong tương lai.
Những gì cần theo dõi tiếp theo
Sự hỗ trợ attribute của Laravel 13 mở rộng ra ngoài các model để bao gồm cả event listeners, notifications, mailables và broadcast events. Khi cộng đồng áp dụng cú pháp này trong các lĩnh vực đó, các mẫu refactoring tương tự sẽ xuất hiện. Hãy theo dõi hướng dẫn nâng cấp chính thức để biết về bất kỳ attribute classes mới nào được ra mắt trong các bản phát hành nhỏ (minor releases) trong tương lai.
Điểm rút ra: Laravel 13 mang đến cho bạn một lộ trình không tốn kém để sở hữu các model gọn nhẹ hơn và thân thiện hơn với IDE. Hãy chuyển đổi từng namespace một, dựa vào Rector và bộ test suite của bạn, và bạn sẽ có được các class có nội dung giống như các đặc tả nghiệp vụ thay vì chỉ là những tệp chứa dữ liệu cấu hình.
