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ố.

1. Redirect đến một URL

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.

2. Redirect đến Named Route

Đâ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');

Redirect kèm tham số

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

3. Redirect về URL trước đó

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.

4. Redirect về trang trước đó kèm thông báo

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!');
}

5. Redirect đến Controller

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.

6. Redirect với query parameters

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

7. Redirect với dữ liệu Session

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.

8. Redirect với HTTP status code

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.

Ví dụ redirect 301

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.

9. Redirect sau khi lưu dữ liệu

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.

10. Redirect sau khi đăng nhập

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.

11. Redirect với 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.

12. Redirect trong Route

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ũ.

13. 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.

14. Một số pattern thực tế nên nhớ

Redirect về trang trước

return back();

Redirect đến route

return redirect()->route('dashboard');

Redirect đến route kèm tham số

return redirect()->route('users.show', $user->id);

Redirect kèm thông báo

return redirect()
    ->route('dashboard')
    ->with('success', 'Thao tác thành công!');

Redirect URL ngoài

return redirect()->away('https://example.com');

Redirect vĩnh viễn

return redirect('/new-url', 301);

Redirect sau đăng nhập

return redirect()->intended('/dashboard');

Redirect trực tiếp trong Route

Route::redirect('/old-url', '/new-url', 301);

15. Nên dùng cách nào?

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(...)

Kết luận

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.

Categories:

Leave Comment