- Laravel là gì và nó giải quyết những vấn đề gì?
Laravel là framework PHP hiện đại với cú pháp gọn đẹp và bộ công cụ phong phú cho phép phát triển ứng dụng nhanh. Nó giải quyết các vấn đề phổ biến: routing (ánh xạ URL), templating (engine Blade), truy cập database (Eloquent ORM), xác…
- Routing trong Laravel là gì và cách định nghĩa route?
Routing ánh xạ URL đến controller action. Định nghĩa trong routes/web.php: Route::get("/users", [UserController::class, "index"]) ánh xạ GET request đến /users vào method index của UserController. Các method khác: Route::post(), Route::put(), Route::delete(). Route parameter: Route::get("/users/{id}", ...) bắt segment URL. Route name: Route::get(...)-name("users.show") cho phép tạo link…
- Blade templating engine trong Laravel là gì?
Blade là engine template đơn giản nhưng đủ dùng của Laravel. Biên dịch cú pháp mustache {{ }} thành code PHP, được cache để tăng hiệu suất. Các directive quan trọng: {{ $variable }} in biến (đã escape), {!! $html !!} in HTML thô, @if,…
- Migration trong Laravel là gì và cách sử dụng?
Migration là định nghĩa schema database được quản lý bằng version control. Tạo bằng php artisan make:migration createuserstable, định nghĩa bảng trong up() và rollback trong down(): Chạy toàn bộ migration đang chờ bằng php artisan migrate. Ưu điểm: theo dõi thay đổi schema trong…
- Mô hình MVC là gì và Laravel áp dụng như thế nào?
MVC tách biệt trách nhiệm (separation of concerns): Model (logic dữ liệu/database), View (giao diện/UI), Controller (xử lý request/logic nghiệp vụ). Request của người dùng đi đến Router, gọi Controller thích hợp. Controller truy vấn Model lấy dữ liệu, rồi render View với dữ liệu…
- Artisan là gì và có những lệnh phổ biến nào?
Artisan là giao diện dòng lệnh của Laravel để tự động hoá các tác vụ phổ biến. Các lệnh thiết yếu: php artisan migrate (chạy migration), php artisan make:controller UserController (tạo controller), php artisan make:model User (tạo model), php artisan serve (khởi động server dev),…
- Controller trong Laravel là gì và có những method nào?
Controller xử lý logic của request, thường ứng với một resource (User, Product): nhận request, làm việc với Model, rồi trả về View hay JSON. php artisan make:controller ProductController --resource sinh sẵn bộ method CRUD — index() (danh sách), show($id) (một bản ghi), create() (form…
- Dependency injection trong Laravel hoạt động như thế nào?
Dependency injection tự động cung cấp các dependency cần thiết cho class. Thay vì new UserRepository() bên trong controller, type-hint trong method: public function index(UserRepository $repo) { return $repo-all(); }. Service container của Laravel tự động khởi tạo và inject class. Lợi ích: dễ test…
- Service Provider trong Laravel là gì?
Service Provider bootstrap các dịch vụ của ứng dụng. Có hai method chính: register() (bind vào container) và boot() (truy cập các service đã bind). Ví dụ: AppServiceProvider đăng ký custom service, MailServiceProvider cài đặt mail. Định nghĩa binding: $this-app-bind(PaymentInterface::class, StripePayment::class). Dùng cho: đăng ký…
- Validation rules trong Laravel là gì và cách validate dữ liệu form?
Validate dữ liệu đầu vào với rules trong controller: $request-validate(["email" = "requiredemail", "name" = "requiredstringmax:100"]). Các rule phổ biến: required (bắt buộc), email (email hợp lệ), unique:table (chưa có trong DB), min:5max:20 (độ dài), confirmed (khớp với fieldconfirmation), regex:/pattern/ (khớp regex). Hiển thị lỗi trong…
- Eloquent ORM là gì và tại sao tốt hơn SQL thuần?
Eloquent là tầng abstraction database của Laravel, cung cấp API hướng đối tượng để thao tác database. Thay vì SQL thuần SELECT FROM users WHERE id=1, dùng User::find(1). Lợi ích: không phụ thuộc vào database cụ thể (dễ chuyển đổi), tự động phòng chống SQL…
- Model trong Laravel là gì và cách tạo chúng?
Model đại diện cho bảng database theo cách hướng đối tượng. Tạo bằng php artisan make:model User. Các property: protected $table (override tên bảng), protected $fillable (cột được mass-assign như name, email), protected $hidden (loại khỏi output như password), protected $casts (ép kiểu như createdat…
- Eloquent relationships là gì và có những loại nào?
Relationships định nghĩa mối liên kết giữa các model. One-to-Many: User có nhiều Post. Định nghĩa trong User model: public function posts() { return $this-hasMany(Post::class); }. Truy cập: $user-posts. Many-to-One (chiều ngược lại): Post belongs to User. One-to-One: User có một Profile. Many-to-Many: Post có…
- Vấn đề N+1 query là gì và cách khắc phục trong Laravel?
Vấn đề N+1 xảy ra khi lấy records cha rồi truy cập relationship trên từng cái. Ví dụ: $users = User::all(); (1 query), sau đó foreach($users as $user) { echo $user-posts; } (N query thêm). Kết quả: 1+N query tổng cộng rất kém hiệu quả.…
- Query scope trong Laravel là gì?
Scope là các điều kiện query dùng lại được. Local scope khai báo ngay trong model: Global scope (implement GlobalScope) áp dụng tự động cho mọi query — chính là cơ chế đứng sau soft delete. Ví dụ: thay vì viết User::where("active", true)-where("age", "", 18)-get()…
- Accessor và Mutator trong Eloquent là gì?
Accessor biến đổi dữ liệu lúc đọc, mutator biến đổi lúc ghi. Cả hai khai báo bằng Attribute::make(): Gán $user-email = "JOHN@EXAMPLE.COM" sẽ lưu xuống dạng chữ thường, còn echo $user-name hiển thị viết hoa dù DB lưu chữ thường. Accessor/mutator gom logic định dạng…
- Soft delete trong Laravel là gì?
Soft delete đánh dấu record là đã xoá mà không thực sự xoá khỏi database. Thêm vào model: use SoftDeletes; và migration thêm $table-softDeletes(); tạo cột deletedat. Query tự động loại trừ record đã soft-delete: User::all() không bao gồm đã xoá. Truy cập bằng: User::withTrashed()-get()…
- Factory và Seeder trong Laravel là gì?
Factory sinh dữ liệu giả để test, tạo bằng php artisan make:factory UserFactory: Seeder dùng để populate database: php artisan make:seeder UserSeeder, bên trong gọi User::factory(100)-create() rồi chạy php artisan db:seed. Đây là bộ đôi thiết yếu cho development (dữ liệu giả) lẫn testing (dữ…
- Query builder trong Laravel là gì và có những ưu điểm gì?
Query builder là fluent API để xây dựng query mà không cần SQL thuần. Ví dụ: DB::table("users")-where("age", "", 18)-orderBy("name")-get();. Ưu điểm: không phụ thuộc database (dễ chuyển đổi), tự động phòng SQL injection (tham số được escape), cú pháp chain dễ đọc, hỗ trợ IDE…
- Service Container trong Laravel là gì và hoạt động như thế nào?
- Event trong Laravel là gì và cách sử dụng?
- Queue trong Laravel là gì và tại sao nên dùng?
- Middleware trong Laravel là gì và cách tạo custom middleware?
- Broadcasting trong Laravel là gì và khi nào nên dùng?
- Policy trong Laravel là gì và cách authorize action?
- Testing trong Laravel là gì và có những loại test nào?
- Facade pattern trong Laravel là gì?
- Collection trong Laravel là gì và cách sử dụng?
- Laravel Reverb là gì và khác Pusher như thế nào?
Reverb là WebSocket server first-party của Laravel, ra mắt cùng Laravel 11 (2024) và hỗ trợ từ Laravel 10+ để broadcasting sự kiện real-time. Khác với Pusher (dịch vụ bên thứ ba tính phí): Reverb tự host (self-hosted), mã nguồn mở, miễn phí, và dùng…
- Laravel Pennant là gì và cách dùng để quản lý feature flags?
Pennant là package feature flag chính thức của Laravel (cài riêng: composer require laravel/pennant, có official support từ Laravel 10+) để bật/tắt tính năng. Hỗ trợ flag đơn giản và logic phức tạp theo class. Ví dụ: Feature::define('new-checkout', fn() = rand(1,100) <= 50) cho A/B…
- Pest là gì và tại sao các project Laravel mới nên dùng thay PHPUnit?
Pest là testing framework hiện đại dựng trên PHPUnit, dùng cú pháp fluent và assertion expect() thay cho $this-assert cồng kềnh: Lợi ích: code test gọn hơn, parallel testing mặc định, watch mode và profiling tích hợp sẵn, hỗ trợ architecture testing lẫn snapshot testing,…
- Sự khác biệt giữa Sanctum và Passport cho API authentication là gì?
Cả hai đều xác thực Laravel API nhưng phục vụ nhu cầu khác nhau. Sanctum: nhẹ, phù hợp cho SPA cùng domain và personal access token, dùng session cho SPA và token DB-less cho mobile/external app. Passport: triển khai đầy đủ OAuth 2.0, phù hợp…
- API Resources trong Laravel là gì và tại sao không trả về raw model data?
API Resources chuyển đổi Eloquent model thành JSON response nhất quán mà không lộ schema DB. Ví dụ: return UserResource::collection($users) thay vì return $users-toJson(). Lợi ích: tự ẩn các field nhạy cảm (password, internal ID), transform format dữ liệu (snakecase sang camelCase), include relationship có…
- DTOs (Data Transfer Objects) là gì và cách cải thiện kiến trúc code?
- Architecture testing trong Laravel với Pest là gì và tại sao quan trọng?
- Sự khác biệt giữa Feature tests và Unit tests trong Laravel là gì?
Feature tests kiểm tra toàn bộ chu trình request/response bao gồm route, middleware, authentication, validation và database—bắt bug thực tế người dùng gặp. Unit tests cô lập từng component (Service, Model method) mà không có HTTP layer. Ví dụ feature test: kiểm tra flow đăng…
- Livewire 3 là gì và cách thay đổi cách phát triển full-stack với Laravel?
- CSRF là gì và chống thế nào (kể cả `@csrf` của Laravel)?
CSRF (Cross-Site Request Forgery) = kẻ tấn công lừa trình duyệt của nạn nhân — đang đăng nhập ở site của bạn — tự gửi một request thay đổi trạng thái (chuyển tiền, đổi email). Trình duyệt tự đính kèm cookie phiên, nên server tưởng…
- Repository pattern trong Laravel/PHP là gì?
Theo Fowler (PoEAA), Repository là lớp trung gian giữa domain và tầng truy vấn dữ liệu, cung cấp API kiểu collection (find, save, findByEmail) và giấu chi tiết Eloquent/SQL bên dưới. Business logic chỉ nói chuyện với repository, không viết query trực tiếp. - Lợi:…
- Caching trong Laravel hoạt động thế nào (stores, tags)?
Laravel cung cấp một API Cache thống nhất trên nhiều driver (store): file, database, redis, memcached, array (cho test), null. Cấu hình trong config/cache.php — đổi backend không phải sửa code. - Cache tags gom nhiều key thành nhóm để xoá cùng lúc: Cache::tags(['posts'])-put(...) rồi…
- Task scheduling trong Laravel là gì?
Thay vì rải nhiều dòng cron rời rạc trên server, Laravel cho định nghĩa lịch chạy bằng code trong routes/console.php (hoặc schedule() của Kernel ở bản cũ). Chốt: chỉ cần một entry cron duy nhất trên server chạy mỗi phút, còn lại Laravel tự quyết…
- File upload và lưu trữ trong Laravel làm thế nào?
Laravel Filesystem (dựa trên Flysystem) quản lý nhiều "disk" — local, public, s3... — cấu hình trong config/filesystems.php, và cùng một API Storage cho mọi disk. Đổi từ local sang S3 không phải sửa code nghiệp vụ. - Validate trước khi lưu: rule file, image,…
- `register()` và `boot()` trong service provider khác nhau thế nào? Đặt sai chỗ thì lỗi gì?
Hai method chạy ở hai pha khác nhau của vòng khởi động ứng dụng. - register() chạy trước, cho mọi provider. Ở đây chỉ được bind vào container (bind, singleton, scoped). Không được đụng tới service của provider khác vì lúc này chưa chắc chúng…
- Form Request là gì? Vì sao nên dùng thay cho `$request->validate()` ngay trong controller?
Form Request là một class kế thừa FormRequest, gom rule validate + quyền truy cập ra khỏi controller. Laravel tự resolve nó qua type-hint, tự chạy validate trước khi vào body controller; sai thì tự redirect kèm lỗi (web) hoặc trả 422 JSON (API). Lợi…
- `bind`, `singleton`, `scoped`, `instance` trong service container khác nhau ra sao? Khi nào dùng cái nào?
Khác nhau ở vòng đời của object mà container trả về. - bind — resolve mỗi lần một instance mới. Dùng cho object có state riêng theo lần dùng. - singleton — resolve một lần, các lần sau trả lại đúng object đó trong suốt…
- Route model binding hoạt động thế nào? Làm sao bind theo `slug` và tránh lộ dữ liệu của user khác?
Route model binding để Laravel tự truy vấn model từ tham số route và inject vào controller; không tìm thấy thì trả 404 luôn. Bind theo cột khác — khai báo ngay trên route hoặc override getRouteKeyName() trên model: Scoped binding — khi route lồng…
- Polymorphic relationship trong Eloquent là gì? Khi nào dùng và có nhược điểm gì?
Polymorphic relationship cho một model thuộc về nhiều loại model cha qua một quan hệ duy nhất. Bảng con giữ hai cột: id (khoá cha) và type (tên class cha). Tình huống thường gặp: comments gắn được vào cả Post lẫn Video; images, likes, activitylogs…
- `hasManyThrough` khác `belongsToMany` như thế nào? Cho ví dụ thực tế.
Cả hai đều đi qua một bảng trung gian nhưng bản chất khác nhau. - belongsToMany — quan hệ nhiều-nhiều, bảng trung gian là pivot không có model riêng (roleuser). Truy cập được dữ liệu pivot qua withPivot(). - hasManyThrough — quan hệ một-nhiều đi…
- Cast, accessor `Attribute` và custom cast trong Eloquent dùng khi nào? Chúng khác nhau ra sao?
Ba mức độ, chọn theo độ phức tạp của phép biến đổi. 1. Cast dựng sẵn — khai báo trong casts(), xử lý kiểu phổ thông. Đây là chỗ nên đặt datetime, boolean, array, encrypted, và cả backed enum của PHP 8.1: 2. Accessor /…
- Một queue job thất bại thì Laravel xử lý ra sao? `tries`, `backoff`, `retryUntil`, `failed()` dùng thế nào?
Job thất bại khi ném exception chưa bắt và đã dùng hết số lần thử. Khi đó Laravel ghi một dòng vào bảng failedjobs và ngừng chạy lại job đó. Các tham số điều khiển: - $tries đặt trên job được ưu tiên hơn cờ…
- Observer khác Event/Listener thế nào? Khi nào chọn cái nào?
Observer gắn vào vòng đời của một Eloquent model. Laravel tự gọi các hook creating, created, updating, updated, deleting, deleted, restored mỗi khi model đó được thao tác — không cần dispatch gì cả. Event/Listener là cơ chế tổng quát: bạn tự định nghĩa event,…
- Thiết kế luồng trừ tồn kho khi nhiều user cùng đặt hàng: dùng transaction và lock ra sao để không bán quá số lượng?
- Làm sao phát hiện N+1 query trước khi lên production? `preventLazyLoading` hoạt động ra sao?
- Job bị dispatch trùng (user bấm 2 lần, cron chồng lần chạy) thì xử lý thế nào? `ShouldBeUnique` khác `WithoutOverlapping` ra sao?
- Vì sao code chạy tốt ở local nhưng lên production `env('API_KEY')` trả về `null`?