#development #laravel #php

Today, I was writing a tool that can give us an overview of the API methods that are used in our application. It's based on parsing the logs from the webserver (nginx in our case).

Since our URLs include things like a company ID or entity ID, I wanted to see if there was a way to map this to route names instead. This would make it easier to see which routes are used and which ones are not.

The approach

To do this, we needed to find a way to get the route name given a URL and method in Laravel. After some research, I found that there is a method called getRoutes() on the Router class that returns all routes registered with the application. This method returns an array of Route objects, which contain information about the route such as the URL pattern, HTTP method, and controller action.

I ended up doing this, asssuming that $path is the URL and $method is the HTTP method:

$route = app('router')->getRoutes()->match(
  app('request')->create(config('app.url') . $path, $method)
);

Let's break down this code snippet step by step and understand its purpose and functionality.

1. The Router Instance

The app('router') part of the code initializes Laravel's router instance. In a Laravel application, the router is responsible for mapping HTTP request URIs to controller actions. It acts as a central dispatcher for incoming requests and ensures they are routed to the appropriate handlers.

2. Accessing Routes

Once we have the router instance, we call the getRoutes() method on it. This method returns an instance of Laravel's RouteCollection. The RouteCollection contains a list of all defined routes in your application. These routes define the URL patterns and the corresponding controller methods that should be executed when a particular URL is accessed.

3. Creating a Request Object

In the next part of the code, we create a new request object using app('request')->create(). The app('request') part fetches the Laravel request instance, and the create() method is used to create a new request object. This new request object is essential because it simulates an incoming HTTP request.

4. Configuring the Request

Within the create() method, we configure the request by specifying the URL and HTTP method. config('app.url') . $path constructs the full URL by appending the provided $path to the base application URL (usually defined in the config/app.php file). The $method variable represents the HTTP method of the request, such as GET, POST, PUT, DELETE, etc.

The request needed to include the app URL as we are checking routes based on the domain name.

5. Matching the Request to a Route

Finally, the match() method is called on the RouteCollection instance to determine which route should handle the request created in the previous step. This method examines the request URL and method and finds the most appropriate route based on the defined routes in your application.

Using the route data

Once we have the route, we can use it to construct a generic route description, e.g. combining the HTTP methods and URI.

$description = Arr::join($route->methods(), '|') . ' ' . $route->uri();

Conclusion

In this blog post, we've explored how you can match a HTTP method and request URI to a normalized route name using the tools provided by Laravel.