Quay lại

Làm thế nào để lấy route name trong laravel Chuyên mục PHP và Laravel    2023-03-15    246 Lượt xem    32 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Làm thế nào để lấy route name trong laravel

Hi ! Lại là mình đây hôm nay mình sẽ hướng dẫn các bạn làm thế nào để lấy được current route name trong laravel.
Mọi route trong laravel đều có tên, bạn có thể sử dụng tên này để tạo URL trong controller của mình với route() helper

Thỉnh thoảng thì bạn muốn lấy cái route hiện tại của mình hoặc route của một action cụ thể nào đó.

Trong bài viết ngắn này, mình cùng nhau khám phá làm thế nào để lấy được tên của route cho cả 2 trường hợp cũng cách tạo ra 1 URL của 1 action mà không cần sử dụng route name

Mục lục :

Làm thế nào để lấy route name trong laravel

1.Lấy route name hiện tại

Cách đơn giản để lấy route hiện tại là sử dụng Route facade và phương thức current(). Mình lấy 1 ví dụ nhé:

use Illuminate\Support\Facades\Route;
$currentRoute = Route::current();

Khi bạn có route hiện tại, bạn có thể tìm và nạp tên của nó bằng cách sử dụng phương thức getName()

$name = $currentRoute->getName();

nếu mà bạn sử dụng instance của Illuminate\Http\Request, bạn có thể lấy route name mà không cần sử dụng Route facade

2.Lấy route name cho 1 action

Nếu bạn muốn tạo 1 URL để redirect về 1 action cụ thể trong controller chúng ta không cần phải sử dụng route name , đơn giản chúng ta chỉ cần sử dụng action() helper . Ví dụ để tạo 1 URL cho index action  trong ExampleController hãy sử dụng đoạn code sau :

$url = action([ExampleController::class, "index"]); 

Route đã được cấu hình với các action này nhưng mà route name thì k cần bắt buộc.

Tuy nhiên nếu bạn vấn muốn lấy cái route name cho 1 action trong laravel cái này thì không khó, bạn có thể sử dụng Route facade để lấy RoutesCollection  và sử dụng nó để tìm ra action mà bạn muốn theo phương thức và class của nó.

Trước đây chúng ta string syntax (cú pháp chuỗi) dưới đây để config route trong routes/web.php

"Namespace\ControllerName@methodName" //regular controller
"Namespace\ControllerName" //invokable controller

Ngày nay laravel đã hỗ trợ cú pháp trôi chảy và thuận tiện hơn nhưng nõ vẫn stores actions theo cách được mô tả ở trên .

Vì vậy bạn format cái string này cho action của bạnvà sử dụng phương thức getByAction() trong RoutesCollection

khi bạn có 1 instance của route , bạn có thể tìm ra name của nó bằng cách gọi phương thức getName()

use Illuminate\Support\Facades\Route;

class RouteUtils
{
    public static function getRouteNameFor(
        string $controllerName,
        string $methodName
    ): string {
        $routesCollection = Route::getRoutes();

        if ($methodName !== "__invoke") {
            $action = $controllerName . "@" . $methodName;
        } else {
            $action = $controllerName;
        }
        $route = $routesCollection->getByAction($action);

        if (null == $route) {
            throw new \RuntimeException("Can`t find route for $action");
        }

        $name = $route->getName();

        if (null == $name) {
            throw new \RuntimeException(
                "Route for action $action does not have a name"
            );
        }

        return $name;
    }
}

Ví dụ về cách sử dụng :

RouteUtils::getRouteNameFor(ExampleController::class, "index"); // example

Kết thúc

Trong bài viết ngắn này bạn đã học được cách làm thế nào để lấy route name trong laravel cho request hiện tai hoặc một route cụ thế

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday