URL Trong Laravel Là Gì?

URL Trong Laravel Là Gì?
URL là cái tên quen thuộc trong làng thiết kế trang web. Do đó, bài viết này sẽ giúp các bạn hiểu hơn về URL, đặc biệt là trong Laravel.

Laravel cung cấp một số helpers để hỗ trợ các bạn lập trình trong chuyện tạo ra URL khi xây dựng một ứng dụng nào đó. Các URL hữu ích khi tạo các liên kết giữa các template trong ứng dụng, gọi API hoặc chuyển hướng trong trang web nhanh gọn.

 

URL là gì?

 

URL là thuật ngữ quen thuộc trong các tài liệu về công nghệ thông tin. URL là cụm từ viết tắt của Uniform Resource Locator (định vị tài nguyên thống nhất). Người ta dùng URL để xác định các tài nguyên và hỗ trợ tạo các siêu văn bản (Hypertext).

 

Các tài nguyên trên Internet được liên kết với nhau thông qua các URL có liên kết. Ví dụ https://hoclaravel.vn/ là một URL. Trên thực tế, khi các bạn mở 1 trình duyệt và gõ vào 1 địa chỉ trang web (https://hoclaravel.vn/) thì đó chính là 1 URL. Với URL này, trình duyệt sẽ nhận thấy nơi cung cấp nội dung của trang web và tải nội dung về cho người dùng. 

 

Các thành phần cơ bản cấu tạo nên URL 

 

Cấu tạo của một URL như sau:

 

URL = scheme:[//authority]path[?query][#fragment]

 

  • Scheme: là giao thức mạng được sử dụng để truyền dẫn dữ liệu. Các giao thức quen thuộc với chúng ta là http, https, ftp, mailto, irc,…Phân cách giao thức với phần còn lại bằng ký tự :.
  • Authority: là phần tổ hợp bao gồm các phần nhỏ hơn. Ví dụ: authority = [[email protected]]domain[:port]
  • Userinfo: là thông tin người dùng (gồm có tên đăng nhập và mật khẩu), chỉ sử dụng với các url được bảo mật và cần đăng nhập
  • Domain: là tên miền của 1 trang web. Nó còn được xem là ánh xạ 1-1 từ một tên miền có thể nhớ qua địa chỉ IP của máy chủ web (nơi chứa nội dung trang web).
  • Port: số cổng sử dụng bởi giao thức trên máy chủ
  • Path: đường dẫn đến nội dung trang web. Đường dẫn này là đường nội bộ trong website. Nó phân cách giữa thư mục cha và con bởi dấu gạch chéo (/). 
  • Query: là chuỗi truy vấn và có chứa các thông tin theo cặp tên + giá trị được gửi tới máy chủ web. Mỗi cặp như vậy cách nhau bởi dấu &. 
  • Fragment: là các chỉ mục con của nội dung và thường được bắt đầu với dấu #

 

Trên thực tế, không phải URL nào cũng phải có đầy đủ các thành phần vừa nêu. 

 

Cách tạo URL cơ bản

 

Hàm helper URL có thể được dùng để tạo URL cho ứng dụng của các bạn. URL tự động được thêm HTTP/HTTPS và host từ request hiện tại. Ví dụ:

 

$post = App\Models\Post::find(1);
echo url("/posts/{$post->id}"); // http://example.com/posts/1

 

Truy cập và lấy thông tin của URL hiện tại

 

Nếu không truyền tham số cho hàm helper URL, 1 đối tượng của Illuminate\Routing\UrlGenerator sẽ được tạo ra. Nó cho phép bạn lấy thông tin của URL hiện tại. 

 

// Get the current URL without the query string...
echo url()->current();
// Get the current URL including the query string...
echo url()->full();
// Get the full URL for the previous request...
echo url()->previous();

 

Các bạn có thể truy cập các phương thức trên thông qua URL façade. 

 

use Illuminate\Support\Facades\URL;
echo URL::current();

 

Sử dụng Named Routes để quản lý URL

 

Hàm helper route có thể được sử dụng để tạo ra URL cho named routes. Named routes cho phép bạn tạo ra URL mà không cần phải định nghĩa URL đó trên route. Vì các route được quản lý từ name. Nên nếu URL của route thay đổi, thì bạn không phải thay đổi ở những nơi đang sử dụng route. 

 

Route::get('/post/{post}', function () {
    //
})->name('post.show');

 

Cách dùng hàm route để gọi route đã định nghĩa

 

echo route('post.show', ['post' => 1]); // http://example.com/post/1

 

Bạn có thể truyền param là 1 đối tượng của Eloquent models. Hàm route sẽ tự động hiểu rằng khóa chính của đối tượng đó là param.

 

echo route('post.show', ['post' => $post]);

 

Bạn cũng có thể truyền nhiều tham số hơn.

 

Route::get('/post/{post}/comment/{comment}', function () {
    //
})->name('comment.show');
echo route('comment.show', ['post' => 1, 'comment' => 3]); // http://example.com/post/1/comment/3

 

Signed URLs 

 

Signed URLs là 1 helper giúp các bạn xác thực xem 1 request gửi lên server có hợp lệ hay không. Laravel cho phép các lập trình viên tạo các URL signed cho các named routes thuận lợi. 

 

Các URL này có hàm băm để tạo ra 1 chuỗi gọi là signature được nối vào chuỗi truy vấn trên URL. Nó giúp Laravel xác minh rằng URL chưa được sửa đổi kể từ khi được tạo. Signed URLs khá hữu ích cho các route có thể truy cập công khai. Tuy nhiên, các bạn cần dùng 1 lớp bảo vệ để ngăn các thao tác bất thường trên URL.

 

Ví dụ bạn muốn tạo ra URL dùng để hủy đăng ký email cho khách hàng: .../user/1/unsubscribe. Link này có thể truy cập trên trình duyệt. Tuy nhiên, nếu người dùng thay đổi ID của user trên đường link, thì điều đó sẽ dẫn đến các user khác cũng bị unsubscribe. Do đó, các bạn cần dùng đến signed urls để xác nhận URL đó là URL thực hay giả mạo. 

 

Để tạo 1 signed url cho route, bạn nên dùng hàm signedRoute của URL facade. Ví dụ: use Illuminate\Support\Facades\URL;

 

return URL::signedRoute('unsubscribe', ['user' => 1]);

 

Nếu muốn tạo 1 signed route URL tạm thời và có thời hạn sử dụng, thì bạn có thể dùng hàm temporarySignedRoute.

 

use Illuminate\Support\Facades\URL;
return URL::temporarySignedRoute(
    'unsubscribe', now()->addMinutes(30), ['user' => 1]
);

 

Xác thực các signed route requests

 

Để xác định request đến có chứa signature có hợp lệ hay không, các bạn có thể dùng hàm hasValidSignature.

 

use Illuminate\Http\Request;
Route::get('/unsubscribe/{user}', function (Request $request) {
    if (! $request->hasValidSignature()) {
        abort(401);
    }
    // ...
})->name('unsubscribe');

 

Hoặc bạn cũng có thể dùng middleware Illuminate\Routing\Middleware\ValidateSignature cho route. Đừng quên bổ sung middleware vào $routeMiddleware trong file App\Http\Kernel.php.

 

Tiếp theo, bạn thêm middleware cho route. 

 

Route::post('/unsubscribe/{user}', function (Request $request) {
    // ...
})->name('unsubscribe')->middleware('signed');

 

Nếu request không có signed hợp lệ, thì middleware sẽ tự động trả về lỗi 403.

 

URLs cho các hành động của controller

 

Hàm action sẽ tạo ra 1 URL cho controller action. Ví dụ:

 

use App\Http\Controllers\HomeController;
$url = action([HomeController::class, 'index']);
// hoặc có tham số truyền vào.
$url = action('[email protected]', ['id' => 1]);

 

Các giá trị mặc định 

 

Ở 1 số ứng dụng, các bạn có thể sử dụng các tham số mặc định trong toàn bộ request trên URL. Ví dụ nhiều route cùng sử dụng 1 param là {locale}. Ví dụ:

 

Route::get('/{locale}/posts', function () {
    //
})->name('post.index');

 

Khó thay đổi khi bạn phải luôn truyền locale mỗi khi sử dụng hàm route. Vì vậy, bạn có thể dùng hàm URL::defaults để xác định giá trị mặc định cho tham số locale (sẽ luôn được thêm vào trong request hiện tại). Bạn cũng có thể gọi phương thức này trong middleware. 

 

<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\URL;
class SetDefaultLocaleForUrls
{
    public function handle($request, Closure $next)
    {
        URL::defaults(['locale' => $request->user()->locale]);
        return $next($request);
    }
}

 

 

Hồ Hữu Hiền

Mình là developer nên đôi khi viết bài không hay lắm mong các bạn thông cảm. Nếu muốn biết thêm thông tin về mình thì vui lòng vào website này để biết. https://huuhienqt.dev/

Bình luận (0)