Route in Laravel 5.8

min read

Day 8  #100DaysOfCode

Trong bài viết tìm hiểu hôm này, mình sẽ xem Route trong Laravel 5.8, ở bài viết trước mình đã download thành công project laravel về máy rồi, nên này sẽ tìm hiểu nó thôi, các bạn có thể xem lại bài viết trước tại đây : Create Project Laravel 5.8 using Composer

Trong laravel Routes rất quan trọng để xác định một ứng dụng website, vì thế mình đi tìm hiểu cơ bản về nó thôi! ::)
Mình tìm hiểu request HTTP về các method sau: (GET,POST,PUT,PATCH,DELETE), nhưng phổ biến nhất là GET,POST, tiếp theo là PUT,DELETE
giờ mình

// routes/web.php 
 Route::get('/',function(){
    return "100daysofcode.hoanguyenit.com";
 });

Hoặc

Route::get('/', function () {
    return view('welcome');
});

/* resources/views/about.blade.php */
Route::get('about', function () {
    return view('about');
});

/* resources/views/product.blade.php */
Route::get('products', function () {
    return view('products');
});

/* resources/views/services.blade.php */
Route::get('services', function () {
    return view('services');
});

Trong đoạn code trên mình dùng Route::get(), có nghĩa là ta đã định nghĩa các bộ định tuyến Route, vì thế chúng ta yêu cầu Laravel phải đối chiếu với các Route này khi có một yêu cầu request gửi tới.
Okay, chúng ta thấy, không phải lúc nào cũng là GET, mà đôi khi yêu cầu được gửi đến là method (POST,PUT,DELETE) thì ta cần cấu hình bộ định tuyến route như sau

Route::get('/', function () {
    return 'Hello, World!';
});
Route::post('/', function () {
    // dùng xử lý thêm dữ liệu vào database, người dùng phải gửi một request POST
});
Route::put('/', function () {
    // dùng xử lý chỉnh sửa dữ liệu, người dùng phải gửi một request PUT
});
Route::delete('/', function () {
    //dùng xử lý xóa dữ liệu , người dùng phải gửi một request DELETE
});
Route::any('/', function () {
    // Xử lý bất kỳ yêu cầu động từ nào cho tuyến đường này
});
Route::match(['get', 'post'], '/', function () {
    // Handle GET or POST requests to this route
});

Ở đây có một số trường hợp bạn đang dùng Ajax,Axio cập nhật dữ liệu, xóa dữ liệu, thì đồi hổi bạn cần thêm add method vào formdata

  //method "PUT"
   const _formdata = new FormData();
    _formdata.append("_method","PUT");
    
  //method "DELETE"
   const _formdata = new FormData();
    _formdata.append("_method","DELETE");

Nói chung bửa trước mình thử kết hợp Laravel + React, nên mình mới bị như vấn đề trên, đó là không xác nhận được method trong request, khi bạn PUT,DELETE bằng Axio
Còn mọi người sao thì mình không rõ, nên mình chia sẻ để đây luôn
Okay, Tiếp theo mình tìm hiểu làm thế nào để route gọi được hành động(action) trong Controller 

VD: mình có file WelcomeController.php trong thư mục app/http/Controllers 

// app/http/controllers/WelcomeController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class WelcomeController extends Controller
{
    
    public function index(){
        return "Hello, 100DaysOfCode";
    }
}

// routes/web.php
Route::get('/', 'WelcomeController@index');

Trong đoạn code trên, yêu cầu Laravel chuyển toàn bộ yêu cầu đến đường dẫn tới phương thức index() của App/Http/Controller/WelcomeController
Tương tự bạn có thể tạo nhiều phương thức hành động trong Controller và dùng Route gọi tới nó.

Tiếp theo mình sẽ chèn tham số trong Route (Route Parameters)
Nếu trong URL mà website bạn có tham số gì đó, ban có thể dùng code dưới đây để xác định nó

Route::get('users/{id}/friends', function ($id) {
    //
});

Bên cạnh đó bạn có thể tùy chọn tham số bằng cách thêm (?) phía sau tham số

Route::get('users/{id}/friends', function ($id) {
 //
});

Trong trường hợp trên bạn cũng nên cung cấp giá trị mặc định cho tham số trong URL

Route::get('users/{id?}', function ($id = 'idUser') {
 //
});

và bạn có thể dùng biểu thức Regular(regexes) để xác định tham số trong URL, có đúng tiêu chuẩn không! 

Route::get('users/{id}', function ($id) {
   //
})->where('id', '[0-9]+');
Route::get('users/{username}', function ($username) {
   //
})->where('username', '[A-Za-z]+');
Route::get('posts/{id}/{slug}', function ($id, $slug) {
   //
})->where(['id' => '[0-9]+', 'slug' => '[A-Za-z]+']);

Các bạn thấy đó, nó yêu câu xác định tham số {id}, phải là số  từ 0->9, còn tham số {slug} yêu cầu phải là chữ A->Z,a->z , http://localhost/laravel58/posts/12/abc
Nếu người dùng cung cấp đúng đường dẫn URL, thì Route mới được thực hiện 
Chúng ta có thể Thiếp lập tên name của một Route mà ta muốn hiển thị ngoài website 

// xác định một name() trong routes/web.php:
Route::get('members/{id}', 'MembersController@show')->name('members.show');
// hiển thị một URL ngoài website như sau
<a href="<?php echo route('members.show', ['id' => 14]); ?>">

Mình có thể chỉnh Route name bất kỳ mà mình thích 
VD :  PhotosController.php có các phương thức(index,create,show,store,edit,update,destroy) ta có thể thiếp lập route name như dưới đây

Route::get('photos','PhotosController@index')->name(photos.index)
Route::get('photos/create','PhotosController@create')->name(photos.create)
Route::post('photos','PhotosController@store')->name(photos.store)
Route::get('photos/{id}','PhotosController@show')->name(photos.show)
Route::get('photos/{id}/edit','PhotosController@edit')->name(photos.edit)
Route::put('photos/{id}','PhotosController@update')->name(photos.update)
Route::delete('photos/{id}','PhotosController@destroy')->name(photos.destroy)

Còn khi trên đường dẫn route của chúng ta có các tham số như: http://localhost/laravel58/users/userId/comments/commentId, trong đó tham số 1 là userId, tham số thứ 2 là commentId 
Ta hiển thị route name như sau:

// App/Http/Controller/WelcomeController.php 
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class WelcomeController extends Controller
{
    
    public function index(){
        $link = route('users.comments.show',[1,4]);
        $link2= route('users.comments.show',['userId'=>1,'commentId'=>2]);
        return "<a href=".$link.">Show</a>";
    }
    public function show($userId,$commentId){
        return "UserId:".$userId."/comment:".$commentId;
    }
}
// routes/web.php
Route::get('/','WelcomeController@index')->name('home');
Route::get('users/{userId}/comments/{commentId}','WelcomeController@show')->name('users.comments.show');

Hay bạn có thể dùng nó trong template blade

// resources/views/home.blade.php 
<a href="{{route('users.comments.show',[1,2])}}">Show</a>
<a href="{{route('users.comments.show',['userId'=>1,'commentId'=>2])}}">Show</a>
<a href="{{route('users.comments.show',['commentId'=>2,'userId'=>1])}}">Show</a>
//http://localhost/laravel58/users/1/comments/2?opt=a
<a href="{{route('users.comments.show', ['userId' => 1, 'commentId' => 2, 'opt' => 'a'])}}">Show</a>

Okay, ngon lành thật sự Laravel hay quá, tiếp theo mình tìm hiểu tiếp về Route Group, mình có thể group lại thành một nhóm cho dễ quản lý ví dụ như dưới đây

Route::group(function () {
    Route::get('users', function () {   
        return 'show all users';
    });
    Route::get('users/1', function () {
        return 'show user';
    });
});

Kiểm tra Middleware trong Route , chúng cần đăng nhập trước khi thực hiện thao tác bên trong, chúng ta có thể tạo middleware riêng biệt cho từng chức năng quản lý của mình và gọi chúng như như route dưới đây,còn việc tạo Middleware thế nào thì nửa mình tìm hiểu tiếp kaka

Route::middleware('auth')->group(function() {
    Route::get('dashboard', function () {
       return view('dashboard');
    });
    Route::get('account', function () {
        return view('account');
    });
});

Thiết lập Prefixes cho Route, nó nghĩa là ta tạo tiền tố đứng trước cho tất cả route, ví dụ: /admin/  admin/users 

Route::prefix('admin')->group(function () {
    Route::get('/', function () {
        // Handles the path /dashboard
    });
    Route::get('users', function () {
        // Handles the path /dashboard/users
    });
});

Thiếp lập Namespace Prefixes trong Route ,ví dụ : App\Http\Controllers thường chứa tất cả các file Controller, nhưng bạn muốn tạo thêm thư mục Api trong này để chứa riêng biệt với các Controller khác bạn cần phải trỏ tới namespace

// App\Http\Controllers\UsersController
Route::get('/', 'UsersController@index');

Route::namespace('Dashboard')->group(function () {
    // App\Http\Controllers\Dashboard\ProductsController
    Route::get('dashboard/products', 'ProductsController@index');
});

Okay, nhiều quá, nhiêu đây là mình thấy đủ mệt rồi, mình xin tạm dừng tại đây, các bạn có thể vào trang chủ Laravel tìm hiểu thêm nhé, trong Laravel còn nhiều thứ lắm, tại mình đuối quá, nhiêu đây thấy nhớ cũng đuối rồi. Để nửa tìm hiểu thêm chia sẻ với mọi người sau

x

Ủng hộ tôi bằng cách click vào quảng cáo. Để tôi có kinh phí tiếp tục phát triển Website!(Support me by clicking on the ad. Let me have the money to continue developing the Website!)