GitHub - spatie/laravel-route-attributes: Use PHP 8 attributes to register route...
source link: https://github.com/spatie/laravel-route-attributes
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Use PHP 8 attributes to register routes in a Laravel app
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:
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')]
Resource controllers
To register a resource controller, use the Resource
attribute as shown in the example below.
You can use only
or except
parameters to manage your resource routes availability.
You can use the names
parameter to set the route names for the resource controller actions. Pass a string value to set a base route name for each controller action or pass an array value to define the route name for each controller action.
Using Resource
attribute with Domain
, Prefix
and Middleware
attributes works as well.
use Spatie\RouteAttributes\Attributes\Resource; #[Prefix('api/v1')] #[Resource('posts', except: ['create', 'edit', 'destroy'], names: 'api.v1.posts')] class PostController { public function index() { } public function store(Request $request) { } public function show($id) { } public function update(Request $request, $id) { } }
Using multiple verbs
To register a route for all verbs, you can use the Any
attribute:
#[Spatie\RouteAttributes\Attributes\Any('my-uri')]
To register a route for a few verbs at once, you can use the Route
attribute directly:
#[Spatie\RouteAttributes\Attributes\Route(['put', 'patch'], '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');
Specifying a domain from a config key
There maybe a need to define a domain from a configuration file, for example where your subdomain will be different on your development environment to your production environment.
config/domains.php
return [
'main' => env('SITE_URL', 'example.com'),
'subdomain' => env('SUBDOMAIN_URL', 'subdomain.exmaple.com')
];
use Spatie\RouteAttributes\Attributes\Get; use Spatie\RouteAttributes\Attributes\Post; use Spatie\RouteAttributes\Attributes\DomainFromConfig; #[DomainFromConfig('domains.main')] class MyController { #[Get('my-get-route')] public function myGetMethod() { } }
When this is parsed, it will get the value of domains.main
from the config file and
register the route as follows;
Route::get('my-get-route', [MyController::class, 'myGetMethod'])->domain('example.com');
Specifying wheres
You can use the Where
annotation on a class or method to constrain the format of your route parameters.
use Spatie\RouteAttributes\Attributes\Get; use Spatie\RouteAttributes\Attributes\Post; use Spatie\RouteAttributes\Attributes\Where; use Spatie\RouteAttributes\Attributes\WhereAlphaNumeric; #[Where('my-where', '[0-9]+')] class MyController { #[Get('my-get-route/{my-where}')] public function myGetMethod() { } #[Post('my-post-route/{my-where}/{my-alpha-numeric}')] #[WhereAlphaNumeric('my-alpha-numeric')] public function myPostMethod() { } }
These annotations will automatically register these routes:
Route::get('my-get-route/{my-where}', [MyController::class, 'myGetMethod'])->where(['my-where' => '[0-9]+']); Route::post('my-post-route/{my-where}/{my-alpha-numeric}', [MyController::class, 'myPostMethod'])->where(['my-where' => '[0-9]+', 'my-alpha-numeric' => '[a-zA-Z0-9]+']);
For convenience, some commonly used regular expression patterns have helper attributes that allow you to quickly add pattern constraints to your routes.
#[WhereAlpha('alpha')] #[WhereAlphaNumeric('alpha-numeric')] #[WhereNumber('number')] #[WhereUuid('uuid')]
Specifying a group
You can use the Group
annotation on a class to create multiple groups with different domains and prefixes for the routes of all methods of that class.
use Spatie\RouteAttributes\Attributes\Get; use Spatie\RouteAttributes\Attributes\Post; use Spatie\RouteAttributes\Attributes\Domain; #[Group(domain: 'my-subdomain.localhost', prefix: 'my-prefix')] #[Group(domain: 'my-second-subdomain.localhost', prefix: 'my-second-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-get-route', [MyController::class, 'myGetMethod'])->prefix('my-prefix')->domain('my-subdomain.localhost'); Route::post('my-post-route', [MyController::class, 'myPostMethod'])->prefix('my-prefix')->domain('my-subdomain.localhost'); Route::get('my-get-route', [MyController::class, 'myGetMethod'])->prefix('my-second-prefix')->domain('my-second-subdomain.localhost'); Route::post('my-post-route', [MyController::class, 'myPostMethod'])->prefix('my-second-prefix')->domain('my-second-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.
Recommend
-
190
-
164
THIS PACKAGE IS NOT MAINTAINED ANYMORE Alternatives: https://github.com/michaeldyrynda/laravel-efficient-uuid &
-
145
A set of useful Laravel collection macros This repository contains some useful collection macros. Spatie is a webdesign agency based in Antwerp, Belgium. You'll find an overview of all our open source projects
-
104
README.md A Laravel Nova tool to backup your application
-
113
README.md View models in Laravel
-
129
README.md THIS PACKAGE IS IN DEVELOPMENT, DO NOT USE IN PRODUCTION YET Use custom html components in your Blade views
-
85
README.md A set of useful Laravel validation rules
-
83
README.md Make your Laravel app comply with the crazy EU cookie law
-
41
README.md Create a static site bundle from a Laravel app
-
5
« back — written by Brent on October 27, 2021 The case for route attributes ...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK