Bài 3: Route trong Laravel - Học lập trình Laravel

Đăng bởi: Admin | Lượt xem: 4903 | Chuyên mục: Laravel


1. Route trong Laravel là gì?

Đúng với tên của nó. Route thực hiện chức năng định tuyến, đường dẫn cho các HTTP request được gửi đến đúng nơi ta muốn nó đến. Nếu như khi làm một project bằng PHP thuần thì chúng ta sử dụng file htaccess dùng để cấu hình máy chủ apache, tức là khi người dùng đánh đường dẫn trên browser thì đường dẫn đó sẽ map trong file htaccess để điều hướng đến các page của trang web. Nhưng trong Laravel thì Route sẽ thực hiện điều đó.

2. Cấu trúc thư mục

Để viết route trong Laravel chúng ta sẽ viết trong routes/web.php - file định nghĩa các route cho web, còn route/api.php để định nghĩa route cho api

3. Cơ bản về Route

Ta sẽ thử viết một route xem nó chạy như nào:
<?php

/*
|--------------------------------------------------------------------------
| 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('test-route', function () {
    return "Hello Laravel!";
});
Gõ vào trình duyệt đường dẫn localhost:8000/test-route ta thấy kết quả
Các phương thức định tuyến có sẵn 
Mặc định route sẽ hỗ trợ các phương thức như sau:
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
Trong đó $url là đường dẫn route và $callback là một hành động nào đó sẽ được thực hiện để trả về
Tham số tùy chọn 
Nhiều khi chúng ta sẽ cần truyền tham số trên đường dẫn, chúng ta cũng có thể truyền trong route. Ví dụ, chúng ta cần lấy ID của user từ URL, chúng ta có thể viết route như sau: 
Route::get('user/{id}', function($id) {
      echo 'ID của user là: ' . $id;
});
Ngoài ta chúng ta cũng có thể truyền nhiều tham số trong URL
Route::get('user/{id}/{name}/{comment}', function($id, $name, $comment) {
      echo 'ID của user là: ' . $id . '<br>';
      echo 'Tên của user là: ' . $name . '<br>';
      echo 'Comment của user: ' . $comment . <br>
});
Tên Route
Tên route cho phép chúng ta thuận tiện hơn khi chuyển hướng các route cụ thể. Chúng ta có thể đặt tên route bằng cách thêm name khi chúng ta địng nghĩa route
Route::get('posts', function () { 
    //code
})->name('posts');
Hoặc ngoài ra chúng ta cũng có thể chỉ định tên route cho controller:
Route::post('posts', 'PostController@store')->name('posts.store');
Nhóm Route
Nhóm route cho phép ta chia sẻ các thuộc tính như middleware hoặc namespaces, trên nhiều route mà không cần định nghĩa lại chúng trên mỗi route riêng. Các thuộc tính chia sẻ được quy định trong một mảng định dạng là tham số đầu tiên của phương thức Route::group 
Route::group(['namespace' => 'Admin'], function () {
    Route::get('/', function ()    {
        //code
    });

    Route::get('posts', function () {
        //code
    });
});
Namespaces 
Namespace trong Laravel giống như PHP namespace được chỉ định với một nhóm controller
Route::group(['namespace' => 'Admin'], function() {
    // Controllers trong namespace "App\Http\Controllers\Admin"
});
Prefix
Chúng ta xét ví dụ sau:
Route::get('admin/posts', 'PostController@index');
Route::get('admin/posts/create', 'PostController@create');
Route::post('admin/posts/store', 'PostController@store');
Route::get('admin/posts/{id}/edit', 'PostController@edit');
Route::patch('admin/posts/{id}', 'PostController@update);
Route::patch('admin/posts/{id}', 'PostController@destroy');
Ta thấy điểm chung của các route trên là nó đều bắt đầu bằng admin vì thế để viết gọn lại các URL thì chúng ta sẽ sử dụng prefix để URL khi định nghĩa route ngắn gọn dễ nhìn hơn
Route::group(['prefix' => 'admin'], function () {
    Route::get('posts', 'PostController@index');
    Route::get('posts/create', 'PostController@create');
    Route::post('posts/store', 'PostController@store');
    Route::get('posts/{id}/edit', 'PostController@edit');
    Route::patch('posts/{id}', 'PostController@update);
    Route::patch('posts/{id}', 'PostController@destroy');
});
Route Model Binding
Ta cùng xét ví dụ:
Route::get('admin/posts/{id}', 'PostController@getPostDetail');

//trong Controller PostController chúng ta sẽ định nghĩa function getPosstDetail như sau

public function getPostDetail($id)
{
    $post = Post::find($id); //trả về một instance model
}
Implicit Binding
Trong Laravel sẽ có hỗ trợ tự động giải quyết gợi ý Eloquent models được xác định bên trong route hoặc controller có tên biến phù hợp với tên segment
Route::get('admin/posts/{post}', 'PostController@getPostDetail');
​
//trong Controller PostController chúng ta sẽ định nghĩa function getPosstDetail như sau
​
public function getPostDetail(Post $post)
{
    //code
}
Trong ví dụ trên, Eloquent đã gợi ý biến $post định nghĩa trong route phù hợp với {post} segment trong URL, Laravel tự động đẩy các model Post có ID phù hợp với giá trị tương ứng từ URL. Nếu không tìm thấy trong CSDL thì nó sẽ trả về lỗi 404 HTTP
Explicit Binding
Để đăng ký một explicit binding, sử dụng phương thức model để xác định cho một tham số. Ta nên định nghĩa explicit bindings bên trong phương thức boot của RouteServiceProvider class
public function boot()
{
    parent::boot();

    Route::model('post', App\Post::class);
}
Trong file web.php định nghĩa một route
Route::get('admin/{post}', 'PostController@getPosstDetail');
Khi ta ràng buộc tham số {post} trong model App\Post, một instance của Post sẽ được inject vào route. Vì vậy ví dụ như một request đến admin/1 sẽ được hiểu như là lấy ra bài post có id = 1. Nếu instance model không tìm thấy trong CSDL, một response 404 HTTP sẽ tự động được sinh ra
Bài tiếp theo: Controller trong Laravel >>
vncoder logo

Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!