
# Resource Controllers
Resource Controllers trong Laravel cung cấp một cách thuận tiện để xử lý các hành động CRUD (Create, Read, Update, Delete) cho các tài nguyên của bạn. Khi bạn tạo một Resource Controller, Laravel sẽ tự động tạo ra các phương thức xử lý các hành động CRUD tiêu chuẩn. Điều này giúp bạn giảm bớt việc phải viết mã thủ công cho các hành động lặp đi lặp lại.
1. Tạo Resource Controller
Để tạo một Resource Controller, bạn sử dụng lệnh Artisan sau:
php artisan make:controller UserController --resource
Lệnh này sẽ tạo ra một controller mới tên là UserController
với các phương thức mặc định cho các hành động CRUD. Đây là các phương thức được tạo ra:
index()
: Hiển thị danh sách tài nguyên.create()
: Hiển thị form để tạo tài nguyên mới.store()
: Lưu trữ tài nguyên mới vào cơ sở dữ liệu.show($id)
: Hiển thị chi tiết một tài nguyên cụ thể.edit($id)
: Hiển thị form để chỉnh sửa một tài nguyên cụ thể.update(Request $request, $id)
: Cập nhật tài nguyên cụ thể trong cơ sở dữ liệu.destroy($id)
: Xóa một tài nguyên cụ thể khỏi cơ sở dữ liệu.
2. Route Resource
Để định tuyến đến Resource Controller, bạn có thể sử dụng phương thức Route::resource
. Ví dụ:
use Illuminate\Support\Facades\Route;
Route::resource('users', UserController::class);
Lệnh này sẽ tự động tạo ra tất cả các tuyến đường cần thiết cho các hành động CRUD tương ứng với các phương thức trong UserController
.
# Actions Handled by Resource Controllers
Verb | URI | Action | Route Name |
GET | /photos |
index | photos.index |
GET | /photos/create |
create | photos.create |
POST | /photos |
store | photos.store |
GET | /photos/{photo} |
show | photos.show |
GET | /photos/{photo}/edit |
edit | photos.edit |
PUT/PATCH | /photos/{photo} |
update | photos.update |
DELETE | /photos/{photo} |
destroy | photos.destroy |
# Tùy Chỉnh Hành Vi Khi Model Không Tồn Tại với Phương Thức missing
Thường thì, một phản hồi HTTP 404 sẽ được tạo ra nếu một resource model không được tìm thấy. Tuy nhiên, bạn có thể tùy chỉnh hành vi này bằng cách gọi phương thức missing
khi xác định resource route của bạn. Phương thức missing chấp nhận một closure sẽ được gọi nếu một Model được ràng buộc một cách ngầm định không thể tìm thấy cho bất kỳ resource's routes nào:
use App\Http\Controllers\UserController;
use App\Models\User;
use Illuminate\Support\Facades\Route;
Route::resource('users', UserController::class)
->missing(function (Request $request) {
return response()->view('errors.custom', [], 404);
});
Trong ví dụ trên, nếu một mô hình User
không được tìm thấy khi truy cập bất kỳ tuyến đường tài nguyên nào của users
, Laravel sẽ trả về một view tùy chỉnh errors.custom
với mã trạng thái 404.
Trong Laravel, tính năng Soft Deletes cho phép bạn "xóa" các bản ghi khỏi cơ sở dữ liệu mà không thực sự xóa chúng. Thay vì bị xóa, một bản ghi sẽ được đánh dấu là đã xóa bằng cách thiết lập giá trị của cột deleted_at
thành thời điểm hiện tại. Điều này giúp bạn dễ dàng khôi phục các bản ghi đã bị xóa nếu cần thiết.
1. Thiết lập Soft Deletes cho một Model
Để sử dụng Soft Deletes, bạn cần làm theo các bước sau:
Thêm cột deleted_at
vào bảng
Bạn có thể sử dụng migration để thêm cột deleted_at
vào bảng của bạn:
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddDeletedAtToUsersTable extends Migration
{
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->softDeletes();
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropSoftDeletes();
});
}
}
Sử dụng trait SoftDeletes
trong model
Bạn cần thêm trait SoftDeletes
vào model của bạn:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Model
{
use SoftDeletes;
protected $dates = ['deleted_at'];
}
2. Sử dụng Soft Deletes
Xóa mềm một bản ghi
Để xóa mềm một bản ghi, bạn chỉ cần gọi phương thức delete
:
$user = User::find(1);
$user->delete();
Khôi phục một bản ghi đã bị xóa mềm
Bạn có thể khôi phục một bản ghi đã bị xóa mềm bằng phương thức restore
:
$user = User::withTrashed()->find(1);
$user->restore();
Xóa vĩnh viễn một bản ghi
Để xóa vĩnh viễn một bản ghi, bạn có thể sử dụng phương thức forceDelete
:
$user = User::withTrashed()->find(1);
$user->forceDelete();
3. Truy vấn với Soft Deletes
Lấy các bản ghi chưa bị xóa
Mặc định, các truy vấn Eloquent sẽ chỉ lấy các bản ghi chưa bị xóa:
$users = User::all();
Lấy tất cả các bản ghi, bao gồm cả bản ghi đã bị xóa
Bạn có thể sử dụng phương thức withTrashed
để lấy tất cả các bản ghi, bao gồm cả những bản ghi đã bị xóa:
$users = User::withTrashed()->get();
Chỉ lấy các bản ghi đã bị xóa
Bạn có thể sử dụng phương thức onlyTrashed
để chỉ lấy những bản ghi đã bị xóa mềm:
$users = User::onlyTrashed()->get();
4. Các phương thức bổ sung
Kiểm tra xem một bản ghi đã bị xóa hay chưa
Bạn có thể sử dụng phương thức trashed
để kiểm tra xem một bản ghi đã bị xóa mềm hay chưa:
$user = User::withTrashed()->find(1);
if ($user->trashed()) {
// Bản ghi đã bị xóa mềm
}
Nested Resources (tài nguyên lồng nhau) cho phép bạn định nghĩa các tuyến đường tài nguyên lồng nhau để biểu diễn mối quan hệ giữa các mô hình. Điều này thường được sử dụng khi một mô hình có mối quan hệ với một mô hình khác, ví dụ như Post
và Comment
.
1. Định Nghĩa Nested Resources
Bạn có thể định nghĩa các nested resources trong tệp định tuyến của mình (routes/web.php
). Dưới đây là một ví dụ về cách định nghĩa nested resources cho Post
và Comment
:
use App\Http\Controllers\PostController;
use App\Http\Controllers\CommentController;
use Illuminate\Support\Facades\Route;
Route::resource('posts', PostController::class);
Route::resource('posts.comments', CommentController::class);
2. URL và Tên Định Tuyến cho Nested Resources
Khi bạn định nghĩa nested resources, Laravel sẽ tự động tạo ra các tuyến đường với các URL và tên định tuyến tương ứng.
Ví dụ URL và tên định tuyến:
GET /posts
-posts.index
GET /posts/{post}
-posts.show
GET /posts/{post}/comments
-posts.comments.index
GET /posts/{post}/comments/{comment}
-posts.comments.show
3. Sử Dụng Nested Resources trong Controller
Bạn có thể sử dụng nested resources trong controller của bạn để quản lý các hành động liên quan đến mô hình lồng nhau.
namespace App\Http\Controllers;
use App\Models\Post;
use App\Models\Comment;
use Illuminate\Http\Request;
class CommentController extends Controller
{
public function index(Post $post)
{
$comments = $post->comments;
return view('comments.index', compact('comments'));
}
public function show(Post $post, Comment $comment)
{
return view('comments.show', compact('post', 'comment'));
}
public function create(Post $post)
{
return view('comments.create', compact('post'));
}
public function store(Request $request, Post $post)
{
$validatedData = $request->validate([
'body' => 'required|max:255',
]);
$post->comments()->create($validatedData);
return redirect()->route('posts.comments.index', $post);
}
public function edit(Post $post, Comment $comment)
{
return view('comments.edit', compact('post', 'comment'));
}
public function update(Request $request, Post $post, Comment $comment)
{
$validatedData = $request->validate([
'body' => 'required|max:255',
]);
$comment->update($validatedData);
return redirect()->route('posts.comments.index', $post);
}
public function destroy(Post $post, Comment $comment)
{
$comment->delete();
return redirect()->route('posts.comments.index', $post);
}
}
4. Ràng Buộc Ngầm Định và Nested Resources
Laravel tự động ràng buộc các Model cho các nested resources. Khi bạn định nghĩa một nested resource, Laravel sẽ tự động ràng buộc các Model cha cho các tuyến đường con. Ví dụ, trong CommentController
, mô hình Post
sẽ tự động được ràng buộc trước khi mô hình Comment
.
Nested resources cung cấp một cách rõ ràng và dễ dàng để quản lý mối quan hệ giữa các mô hình trong ứng dụng Laravel của bạn. Bằng cách sử dụng nested resources, bạn có thể tạo ra các tuyến đường và controller hành động cho các mô hình lồng nhau một cách trực quan và dễ dàng.
Danh mục
Bài viết liên quan

Blade Basics
Author: | ADMIN |
---|

Hiển thị giá trị trong Blade
Author: | ADMIN |
---|

Layout: @include, @extends, @section, @yield
Author: | ADMIN |
---|
Bài viết khác

Blade Basics
Author: | ADMIN |
---|

9 Mẹo Hữu Ích Khi Sử Dụng Blade Trong Laravel
Author: | ADMIN |
---|

Hiển thị giá trị trong Blade
Author: | ADMIN |
---|