Need help with laravel-route-attributes?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

spatie
155 Stars 13 Forks MIT License 124 Commits 0 Opened issues

Description

Use PHP 8 attributes to register routes in a Laravel app

Services available

!
?

Need anything else?

Contributors list

Use PHP 8 attributes to register routes in a Laravel app

Latest Version on Packagist Tests Type Coverage

This package provides annotations to automatically register routes. Here's a quick example:

use Spatie\RouteAttributes\Attributes\Get;

class MyController { #[Get('my-route')] public function myMethod() {

}

}

This attribute will automatically register this route:

Route::get('my-route', [MyController::class, 'myMethod']);

Are you a visual learner?

In this video you'll get an introduction to PHP 8 attributes and how this laravel-routes-attributes works under the hood.

Support us

We invest a lot of resources into creating best in class open source packages. You can support us by buying one of our paid products.

We highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using. You'll find our address on our contact page. We publish all received postcards on our virtual postcard wall.

Installation

You can install the package via composer:

composer require spatie/laravel-route-attributes

You can publish the config file with:

bash
php artisan vendor:publish --provider="Spatie\RouteAttributes\RouteAttributesServiceProvider" --tag="config"

This is the contents of the published config file:

return [
    /*
     *  Automatic registration of routes will only happen if this setting is `true`
     */
    'enabled' => true,

/*
 * Controllers in these directories that have routing attributes
 * will automatically be registered.
 */
'directories' => [
    app_path('Http/Controllers'),
],

];

Usage

The package provides several annotations that should be put on controller classes and methods. These annotations will be used to automatically register routes

Adding a GET route

use Spatie\RouteAttributes\Attributes\Get;

class MyController { #[Get('my-route')] public function myMethod() {

}

}

This attribute will automatically register this route:

Route::get('my-route', [MyController::class, 'myMethod']);

Using other HTTP verbs

We have left no HTTP verb behind. You can use these attributes on controller methods.

#[Spatie\RouteAttributes\Attributes\Post('my-uri')]
#[Spatie\RouteAttributes\Attributes\Put('my-uri')]
#[Spatie\RouteAttributes\Attributes\Patch('my-uri')]
#[Spatie\RouteAttributes\Attributes\Delete('my-uri')]
#[Spatie\RouteAttributes\Attributes\Options('my-uri')]

Specify a route name

All HTTP verb attributes accept a parameter named

name
that accepts a route name.
use Spatie\RouteAttributes\Attributes\Get;

class MyController { #[Get('my-route', name: "my-route-name")] public function myMethod() {

}

}

This attribute will automatically register this route:

Route::get('my-route', [MyController::class, 'myMethod'])->name('my-route-name');

Adding middleware

All HTTP verb attributes accept a parameter named

middleware
that accepts a middleware class or an array of middleware classes.
use Spatie\RouteAttributes\Attributes\Get;

class MyController { #[Get('my-route', middleware: MyMiddleware::class)] public function myMethod() {

}

}

This annotation will automatically register this route:

Route::get('my-route', [MyController::class, 'myMethod'])->middleware(MyMiddleware::class);

To apply middleware on all methods of a class you can use the

Middleware
attribute. You can mix this with applying attribute on a method.
use Spatie\RouteAttributes\Attributes\Get;
use Spatie\RouteAttributes\Attributes\Middleware;

#[Middleware(MyMiddleware::class)] class MyController { #[Get('my-route')] public function firstMethod() { }

#[Get('my-other-route', middleware: MyOtherMiddleware::class)]
public function secondMethod()
{
}

}

These annotations will automatically register these routes:

Route::get('my-route', [MyController::class, 'firstMethod'])->middleware(MyMiddleware::class);
Route::get('my-other-route', [MyController::class, 'secondMethod'])->middleware([MyMiddleware::class, MyOtherMiddleware]);

Specifying a prefix

You can use the

Prefix
annotation on a class to prefix the routes of all methods of that class.
use Spatie\RouteAttributes\Attributes\Get;
use Spatie\RouteAttributes\Attributes\Post;
use Spatie\RouteAttributes\Attributes\Prefix;

#[Prefix('my-prefix')] class MyController { #[Get('my-get-route')] public function myGetMethod() { }

#[Post('my-post-route')]
public function myPostMethod()
{
}

}

These annotations will automatically register these routes:

Route::get('my-prefix/my-get-route', [MyController::class, 'myGetMethod']);
Route::post('my-prefix/my-post-route', [MyController::class, 'myPostMethod']);

Specifying a domain

You can use the

Domain
annotation on a class to prefix the routes of all methods of that class.
use Spatie\RouteAttributes\Attributes\Get;
use Spatie\RouteAttributes\Attributes\Post;
use Spatie\RouteAttributes\Attributes\Domain;

#[Domain('my-subdomain.localhost')] class MyController { #[Get('my-get-route')] public function myGetMethod() { }

#[Post('my-post-route')]
public function myPostMethod()
{
}

}

These annotations will automatically register these routes:

Route::get('my-get-route', [MyController::class, 'myGetMethod'])->domain('my-subdomain.localhost');
Route::post('my-post-route', [MyController::class, 'myPostMethod'])->domain('my-subdomain.localhost');

Testing

composer test

Changelog

Please see CHANGELOG for more information on what has changed recently.

Contributing

Please see CONTRIBUTING for details.

Security Vulnerabilities

Please review our security policy on how to report security vulnerabilities.

Credits

License

The MIT License (MIT). Please see License File for more information.

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.