Using route transformers | laravel-route-discovery | Spatie

 SPATIE

  Laravel Route Discovery
==========================

spatie.be/open-source

  [Docs](https://spatie.be/docs)  [Laravel-route-discovery](https://spatie.be/docs/laravel-route-discovery/v1)  Advanced-usage  Using route transformers

 Version   v1

 Other versions for crawler [v1](https://spatie.be/docs/laravel-route-discovery/v1)

- [ Introduction ](https://spatie.be/docs/laravel-route-discovery/v1/introduction)
- [ Support us ](https://spatie.be/docs/laravel-route-discovery/v1/support-us)
- [ Requirements ](https://spatie.be/docs/laravel-route-discovery/v1/requirements)
- [ Installation &amp; setup ](https://spatie.be/docs/laravel-route-discovery/v1/installation-setup)
- [ Questions and issues ](https://spatie.be/docs/laravel-route-discovery/v1/questions-issues)
- [ Changelog ](https://spatie.be/docs/laravel-route-discovery/v1/changelog)
- [ About us ](https://spatie.be/docs/laravel-route-discovery/v1/about-us)

Discovering routes for controllers
----------------------------------

- [ Getting started ](https://spatie.be/docs/laravel-route-discovery/v1/discovering-routes-for-controllers/getting-started)
- [ Mapping controllers to routes ](https://spatie.be/docs/laravel-route-discovery/v1/discovering-routes-for-controllers/mapping-controllers-to-routes)

Discovering routes for views
----------------------------

- [ Discovering routes for views ](https://spatie.be/docs/laravel-route-discovery/v1/discovering-routes-for-views/getting-started)
- [ Mapping views to routes ](https://spatie.be/docs/laravel-route-discovery/v1/discovering-routes-for-views/mapping-views-to-routes)

Advanced usage
--------------

- [ Using route transformers ](https://spatie.be/docs/laravel-route-discovery/v1/advanced-usage/using-route-transformers)

 Using route transformers
========================

###  On this page

1. [ Creating your own route transformer ](#content-creating-your-own-route-transformer)

Under the hood, the package will build up a collection of `Spatie\RouteDiscovery\PendingRoutes\PendingRoute` instances by looking at the controllers and views in your project. This collection of `PendingRoutes` can be modified by a `PendingRouteTransformer`. After that, each `action` inside a `PendingRoute` will be registered as a regular Laravel route.

In the `route-discovery` config file you'll see the registered route transformers.

```
// in config/route-discovery.php

/*
 * After having discovered all controllers, these classes will manipulate the routes
 * before registering them to Laravel.
 *
 * In most cases, you shouldn't change these.
 */
'pending_route_transformers' => [
    ...Spatie\RouteDiscovery\Config::defaultRouteTransformers(),
    //
],
```

This is the returned value of `Spatie\RouteDiscovery\Config::defaultRouteTransformers()`:

```
[
    Spatie\RouteDiscovery\PendingRouteTransformers\HandleDoNotDiscoverAttribute::class,
    Spatie\RouteDiscovery\PendingRouteTransformers\AddControllerUriToActions::class,
    Spatie\RouteDiscovery\PendingRouteTransformers\HandleUrisOfNestedControllers::class,
    Spatie\RouteDiscovery\PendingRouteTransformers\HandleRouteNameAttribute::class,
    Spatie\RouteDiscovery\PendingRouteTransformers\HandleMiddlewareAttribute::class,
    Spatie\RouteDiscovery\PendingRouteTransformers\HandleHttpMethodsAttribute::class,
    Spatie\RouteDiscovery\PendingRouteTransformers\HandleUriAttribute::class,
    Spatie\RouteDiscovery\PendingRouteTransformers\HandleFullUriAttribute::class,
    Spatie\RouteDiscovery\PendingRouteTransformers\HandleWheresAttribute::class,
    Spatie\RouteDiscovery\PendingRouteTransformers\AddDefaultRouteName::class,
    Spatie\RouteDiscovery\PendingRouteTransformers\HandleDomainAttribute::class,
    Spatie\RouteDiscovery\PendingRouteTransformers\MoveRoutesStartingWithParametersLast::class,
];
```

These transformers will handle specific `Route` attributes, make sure the routes are registered in the correct orders, ...

Creating your own route transformer
-----------------------------------------------------------------------------------------------------------------------------------------------------------------

You can create your own route transformer by letting a class implement the `Spatie\RouteDiscovery\PendingRouteTransformers\PendingRouteTransformer` interface. Here's how that interface looks like:

```
use Illuminate\Support\Collection;
use Spatie\RouteDiscovery\PendingRoutes\PendingRoute;

interface PendingRouteTransformer
{
    /**
     * @param Collection $pendingRoutes
     *
     * @return Collection
     */
    public function transform(Collection $pendingRoutes): Collection;
}
```

After you've created your transformer, register it in the `pending_route_transformers` key of the `route-discovery` config file.

Take a look at one of the default route transformers for an example implementation.
