Laravel redirect() – Các cách Redirect thường dùng
- Home
- Laravel redirect() – Các cách Redirect thường dùng
Trong quá trình phát triển ứng dụng với Laravel, việc chuyển người dùng từ URL này sang URL khác là thao tác rất phổ biến. Laravel cung cấp helper redirect() giúp xử lý redirect một cách nhanh chóng, rõ ràng và linh hoạt.
Trong bài viết này, chúng ta sẽ tìm hiểu các cách sử dụng redirect() thường gặp trong Laravel, từ redirect đến URL, route, controller cho đến redirect kèm session và tham số.
Cách đơn giản nhất là truyền URL trực tiếp vào redirect():
return redirect('/dashboard');
Khi người dùng truy cập action hiện tại, Laravel sẽ trả về HTTP redirect đến:
/dashboard
Có thể sử dụng URL đầy đủ:
return redirect('https://dcsofttech.com');
Tuy nhiên, trong ứng dụng Laravel, nếu URL tương ứng với một route thì nên ưu tiên redirect bằng route name thay vì hard-code URL.
Đây là một trong những cách được sử dụng thường xuyên nhất.
Ví dụ khai báo route:
Route::get('/dashboard', function () {
return view('dashboard');
})->name('dashboard');
Sau đó redirect:
return redirect()->route('dashboard');
Ưu điểm là khi thay đổi URL /dashboard thành một URL khác, code redirect không cần thay đổi.
Ví dụ:
Route::get('/admin/dashboard', function () {
return view('dashboard');
})->name('dashboard');
Code vẫn giữ nguyên:
return redirect()->route('dashboard');
Nếu route có tham số:
Route::get('/user/{id}', function ($id) {
return view('user', compact('id'));
})->name('user.profile');
Có thể truyền tham số như sau:
return redirect()->route('user.profile', ['id' => $user->id]);
Laravel sẽ tạo URL tương ứng:
/user/10
Laravel cung cấp:
return redirect()->back();
Cách này rất hữu ích khi xử lý form.
Ví dụ:
public function store(Request $request)
{
// Xử lý dữ liệu
return redirect()->back();
}
Người dùng sẽ được đưa trở lại trang trước đó.
Có thể viết ngắn hơn:
return back();
Trong thực tế, back() thường được sử dụng khi muốn quay lại trang mà người dùng vừa truy cập.
Một pattern rất phổ biến trong Laravel là redirect về trang trước và gửi thông báo qua session:
return redirect()
->back()
->with('success', 'Lưu dữ liệu thành công!');
Trong Blade:
@if (session('success'))
<div class="alert alert-success">
{{ session('success') }}
</div>
@endif
Sau khi xử lý thành công, người dùng sẽ quay lại trang trước và nhìn thấy thông báo.
Ví dụ:
public function update(Request $request, User $user)
{
$user->update($request->all());
return redirect()
->back()
->with('success', 'Cập nhật tài khoản thành công!');
}
Laravel cũng cho phép redirect trực tiếp đến một controller action.
Ví dụ:
return redirect()->action([UserController::class, 'index']);
Nếu controller có tham số:
return redirect()->action(
[UserController::class, 'show'],
['id' => $user->id]
);
Tuy nhiên, với ứng dụng Laravel hiện đại, named route thường dễ quản lý hơn vì route name giúp tách biệt logic redirect khỏi cấu trúc controller.
Bạn có thể truyền query string thông qua URL:
return redirect('/users?status=active');
Khi đó URL sẽ là:
/users?status=active
Hoặc sử dụng route:
return redirect()->route('users', [
'status' => 'active'
]);
Laravel sẽ tạo query string tương ứng nếu status không phải là parameter bắt buộc của route.
Ví dụ:
/users?status=active
Ngoài thông báo thành công, with() có thể dùng để lưu dữ liệu tạm thời vào session.
Ví dụ:
return redirect()
->route('profile')
->with('message', 'Thông tin đã được cập nhật.');
Trong Blade:
{{ session('message') }}
Có thể truyền nhiều dữ liệu:
return redirect()
->route('profile')
->with([
'success' => 'Cập nhật thành công!',
'type' => 'profile'
]);
Sau redirect, các dữ liệu này có thể được lấy từ session.
Mặc định Laravel thường sử dụng HTTP status code 302 cho redirect.
Bạn có thể chỉ định status code:
return redirect('/new-url', 301);
Trong đó:
301: URL đã được chuyển vĩnh viễn.302: chuyển hướng tạm thời.303: thường được sử dụng để redirect sau một request POST.307: redirect tạm thời nhưng giữ nguyên HTTP method.308: redirect vĩnh viễn và giữ nguyên HTTP method.Khi một URL cũ đã được thay thế hoàn toàn:
return redirect('/new-page', 301);
Điều này đặc biệt hữu ích khi xử lý thay đổi URL trong website và SEO.
Một pattern rất phổ biến trong Laravel là:
public function store(Request $request)
{
$user = User::create([
'name' => $request->name,
'email' => $request->email,
]);
return redirect()->route('users.show', $user->id);
}
Sau khi tạo user thành công, Laravel chuyển người dùng đến trang chi tiết.
Có thể kết hợp với thông báo:
return redirect()
->route('users.show', $user->id)
->with('success', 'Tạo người dùng thành công!');
Đây là pattern rất phổ biến trong các ứng dụng CRUD.
Ví dụ sau khi xác thực thành công:
return redirect()->route('dashboard');
Nếu muốn quay lại URL mà người dùng định truy cập trước khi đăng nhập, Laravel cũng hỗ trợ cơ chế intended redirect.
Ví dụ:
return redirect()->intended('/dashboard');
Nếu trước đó người dùng đang cố truy cập một URL yêu cầu đăng nhập, Laravel có thể đưa họ trở lại URL đó sau khi đăng nhập thành công.
Nếu không có URL trước đó, Laravel sẽ sử dụng:
/dashboard
làm URL mặc định.
away()Nếu muốn chuyển người dùng sang một website bên ngoài:
return redirect()->away('https://google.com');
Ví dụ:
return redirect()->away('https://dcsofttech.com');
away() phù hợp khi URL đích nằm ngoài ứng dụng Laravel.
Không nhất thiết phải viết redirect trong Controller. Laravel cho phép redirect trực tiếp trong file route.
Ví dụ:
Route::redirect('/old-page', '/new-page');
Khi truy cập:
/old-page
Laravel sẽ chuyển hướng đến:
/new-page
Có thể chỉ định status code:
Route::redirect('/old-page', '/new-page', 301);
Đây là cách rất gọn để xử lý các URL cũ.
redirect() và to_route()Trong các phiên bản Laravel mới, bạn cũng có thể sử dụng:
return to_route('dashboard');
Thay cho:
return redirect()->route('dashboard');
Ví dụ có tham số:
return to_route('users.show', [
'id' => $user->id
]);
Hai cách này đều có thể sử dụng để redirect đến named route.
Nếu project đang sử dụng code Laravel phổ biến hoặc cần tương thích với nhiều phiên bản, redirect()->route() vẫn là cách rất dễ nhận biết.
return back();
return redirect()->route('dashboard');
return redirect()->route('users.show', $user->id);
return redirect()
->route('dashboard')
->with('success', 'Thao tác thành công!');
return redirect()->away('https://example.com');
return redirect('/new-url', 301);
return redirect()->intended('/dashboard');
Route::redirect('/old-url', '/new-url', 301);
Trong phần lớn ứng dụng Laravel, có thể ghi nhớ quy tắc đơn giản:
| Trường hợp | Cách dùng |
|---|---|
| Redirect đến URL | redirect('/url') |
| Redirect đến named route | redirect()->route('name') |
| Quay lại trang trước | back() |
| Redirect kèm thông báo | redirect()->with(...) |
| Redirect sau đăng nhập | redirect()->intended(...) |
| Redirect đến Controller | redirect()->action(...) |
| Redirect website bên ngoài | redirect()->away(...) |
| Redirect 301 | redirect('/url', 301) |
| Redirect ngay trong route | Route::redirect(...) |
| Redirect named route theo cú pháp ngắn | to_route(...) |
redirect() là một helper nhỏ nhưng xuất hiện rất thường xuyên trong các ứng dụng Laravel, đặc biệt khi xây dựng các chức năng CRUD, authentication và xử lý form.
Trong thực tế, ba cách nên nhớ đầu tiên là:
return redirect()->route('dashboard');
return back();
return redirect()
->route('dashboard')
->with('success', 'Thao tác thành công!');
Nắm vững các pattern này sẽ giúp code Controller Laravel ngắn gọn, dễ đọc và dễ bảo trì hơn.