Route trong Laravel
Trong hướng dẫn này các bạn sẽ học cách sử dụng Route trong Laravel
Route là gì?
Route trong Laravel có nhiệm vụ nhận yêu cầu của người dùng và chuyển yêu cầu đó đến nơi xử lý sau đó trả về kết quả. Ví dụ khi bạn truy cập một bài viết trên VZN.vn với đường dẫn https://vzn.vn/mau-code-dang-nhap-bang-php-voi-ket-noi-pdo/
thì Route sẽ chuyển đến nơi xử lý code hiển thị nội dung bài viết. Route trong Laravel có thể bao gồm 1 phương thức hoặc nhiều phương thức xử lý vấn đề(GET, POST, MATCH ...) và Trong Laravel có 3 loại Route chính như sau:
- Route dành cho web.
- Route dành cho cli (commnad).
- Route dành cho broadcast.
Sau đây chúng ta đi nghiên cứu từng loại Route với ví dụ cụ thể để các bạn dễ hình dung để có cái nhìn tổng quan về chúng
Route dành cho web
Để khai báo route dành cho web thì các bạn có thể chọn 1 trong 2 cách:
Mặc định
Mặc định thì route dành cho web sẽ được khai báo tại routes/web.php
hoặc routes/api.php
. Trong đó, nếu bạn khai báo route trong routes/api.php
thì các đường dẫn (path) sẽ được thêm tiền tố api ở phía trước.
Tùy chỉnh
Nếu các bạn không muốn khai báo theo mặc định mà muốn khai báo trong file tùy chỉnh theo ý mình thì các bạn cần phải Khai báo file đó trong app/Providers/RouteServiceProvider.php
.
Ví dụ về khai báo như này
Ví dụ
<?php
namespace App\Providers;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
/**
* The path to the "home" route for your application.
*
* This is used by Laravel authentication to redirect users after login.
*
* @var string
*/
public const HOME = '/home';
/**
* The controller namespace for the application.
*
* When present, controller route declarations will automatically be prefixed with this namespace.
*
* @var string|null
*/
// protected $namespace = 'App\\Http\\Controllers';
/**
* Define your route model bindings, pattern filters, etc.
*
* @return void
*/
public function boot()
{
$this->configureRateLimiting();
$this->routes(function () {
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
Route::middleware('vzn')
->namespace($this->namespace)
->group(base_path('routes/vzn.php'));
});
}
/**
* Configure the rate limiters for the application.
*
* @return void
*/
protected function configureRateLimiting()
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip());
});
}
}
Route trong Laravel hỗ trợ chúng ta định nghĩa cho tất cả các phương thức yêu cầu HTTP (request method) như:
Route::get($uri, $callback)
- nhận resquest với phương thức GET.Route::post($uri, $callback)
- nhận resquest với phương thức POST.Route::put($uri, $callback)
- nhận resquest với phương thức PUT.Route::patch($uri, $callback)
- nhận resquest với phương thức PATCH.Route::delete($uri, $callback)
- nhận resquest với phương thức DELETE.Route::options($uri, $callback)
- nhận resquest với phương thức OPTIONS.Route::match($methods, $uri, $callback)
kết hợp hiều phương phứcRoute::any($uri, $callback)
nhận tất cả các phương thức- Route::redirect($uri, $redirectTo, $status)
Route::view($uri, $viewName, $data)
- Route view chỉ work với HTTP request GET hoặc HEAD.Route::filter
tạo ra bộ lọc nhằm mục đích nào đó, ví dụ tạo bộ lọc kiểm tra đã đăng nhập hay chưaRoute::group
gom các route lại với nhau thành một nhómRoute::controller
gọi đến controller tương ứngRoute::resource
sử dụng với resource controller
- $uri
là path mà bạn muốn route xử lí.
- $callback
là một callback, callable hoặc một array chứa thông tin controller và phương thức tác động đến.
- $methods
là một array chứa các phương thức mà bạn muốn route này xử lí.
- $redirectTo
là path mà bạn muốn redirect đến.
- $status
là http status mà các bạn muốn thiết lập, mặc định $status
là 302
- $viewName
là view mà bạn muốn render.
- $data
data mà bạn muốn truyền vào view.
VD: Khai báo route chao-mung
sẽ trả về chuỗi "Chào mừng bạn đến với VZN.vn" khi truy cập vào đường dẫn domain.com/chao-mung/
.
Ví dụ
<?php
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::get('chao-mung/', function () {
return 'Chào mừng bạn đến với VZN.vn';
});
Kết quả:
VD: Khai báo route api/welcome cũng sẽ trả về chuỗi "Chào mừng bạn đến với VZN.vn". Nhưng sẽ đặt trong file routes/api.php.
Ví dụ
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
Route::get('welcome/', function () {
return 'Chào mừng bạn đến với VZN.vn';
});
Vì Route đặt trong file api nên nó sẽ tự động sinh ra đường dẫn api/welcome
do đó chúng ta sẽ không cần thêm tiền tố api vào trước path nữa.
Kết quả:
Ngoài ra nếu như bạn muốn đưa logic vào trong controller thì bạn có thể sử dụng cú pháp như sau:
Trong đó:
routeMethod
là phương thức xử lý của Route (method action).$uri
là path mà bạn muốn xử lí.$controllerName
là controller chứa logic.$method
là phương thức trong controller chứa logic để xử lí cho route đó.
VD: Chúng ta sẽ thực hiện viết logic code của ví dụ trên vào WelcomeController.
Tạo file app/Http/Controllers/WelcomeController.php
với nội dung:
Ví dụ
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class WelcomeController extends Controller
{
public function welcome()
{
return "Chào mừng bạn đến với VZN.vn";
}
}
Chỉnh sửa routes/web.php
Ví dụ
<?php
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('chao-mung/', [\App\Http\Controllers\WelcomeController::class, 'welcome']);
Kết quả tương tự như trên khi bạn truy cập vào domain.com/chao-mung/
Ngoài ra trong khi thiết kế website các bạn sẽ thường thấy có những route có chung tiền tố thì các bạn có thể dùng phương thức group để xử lý các route đó, như ví dụ dưới đây:
Ví dụ
<?php
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::prefix('about')->group(function () {
// đường dẫn: /about/lien-he
Route::get('lien-he', function () {
return "Liên hệ với chúng tôi";
});
// đường dẫn: /about/gioi-thieu
Route::get('gioi-thieu', function () {
return "Giới thiệu về chúng tôi";
});
});