Tổng hợp 55 câu hỏi phỏng vấn Laravel kèm đáp án chi tiết, song ngữ Việt–Anh — sắp xếp từ cơ bản đến nâng cao. Ôn luyện miễn phí, tự động lưu tiến độ.
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 á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 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 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…
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à 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 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 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 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ý…
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 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 đạ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…
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 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ả.…
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 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 đá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 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 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…
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…
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à 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,…
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 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ó…
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…
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…
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:…
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…
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…
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,…
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à 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…
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 để 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 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…
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…
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 /…
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 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,…