An organized approach to handling routes in Laravel.
This package provides you with an easy-to-use system to separate route logic into routers based on functionality while also providing additional functionality. A replacement for those bulky web.php
and api.php
route files that are often lacking any structure and break Laravel structure conventions of separating everything in classes instead of regular PHP files.
Do note that it changes nothing to the way you define your routes. It's just a way of organizing them. Optionally you can use the additional functionality it provides, but that's not a requirement.
- Requirements
- How to install
- How to use
- Optional features
- License
- Change log
- Testing
- Contributing
- Security
- Credits
- About
- PHP 7.3 or higher
- Laravel 7.0 or higher
Looking for support for earlier versions? Try out any of the previous package versions.
Just add the package to your project using Composer and Laravel will auto-discover it:
composer require sebastiaanluca/laravel-router
If you want to be able to register your routers in a single place, add the RegistersRouters
trait to your HTTP kernel (found at App\Http\Kernel
):
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
use SebastiaanLuca\Router\Kernel\RegistersRouters;
class Kernel extends HttpKernel
{
use RegistersRouters;
}
The following is an example of a router. It can be placed anywhere you like, though I'd suggest grouping them in the App\Http\Routers
directory.
<?php
namespace App\Http\Routers;
use SebastiaanLuca\Router\Routers\Router;
class UserRouter extends Router
{
/**
* Map the routes.
*/
public function map()
{
$this->router->group(['middleware' => ['web', 'guest']], function () {
$this->router->get('/users', function () {
return view('users.index');
});
});
}
}
The map
method is where you should define your routes and is the only requirement when using a router. The Laravel routing instance is automatically resolved from the IoC container, so you can use any standard routing functionality you want. Of course you can also use the Route
facade.
To automatically have the framework load your router and map its routes, add the trait and add the router to the $routers
array in your application's HTTP kernel class:
/**
* The application routers to automatically boot.
*
* @var array
*/
protected $routers = [
\App\Http\Routers\UserRouter::class,
];
If you don't want to or can't add the trait to the kernel, you can also register the router manually by just instantiating it (in a service provider for instance). The parent base router will automatically resolve all dependencies and call the map
method on your router.
app(\App\Http\Routers\UserRouter::class);
Especially useful in packages!
To use the following optional features, register the RegisterRoutePatterns
class:
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
use SebastiaanLuca\Router\Kernel\RegistersRouters;
class Kernel extends HttpKernel
{
use RegistersRouters;
/**
* The application routers to automatically boot.
*
* @var array
*/
protected $routers = [
\SebastiaanLuca\Router\Routers\RegisterRoutePatterns::class,
];
}
Laravel provides a convenient way to validate URL parameters using patterns in routes. This package provides a predefined set of such patterns so you don't have to repeatedly add them to each route or define them yourself. The following parameter patterns are currently included:
- id (
\d+
) - hash (
[a-z0-9]+
) - uuid (
[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
) - slug (
[a-z0-9-]+
) - token (
[a-zA-Z0-9]{64}
)
So forget about writing:
Route::get('user/activations/{uuid}', function ($uuid) {
return view('users.activations.show');
})->where('uuid', '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}');
Just use the {uuid}
or any other pattern in your route:
$this->router->get('user/activations/{uuid}', function ($uuid) {
return view('users.activations.show');
});
Another great feature of Laravel is sub-domain routing which allows you to handle multiple subdomains within a single Laravel project. The only caveat there is that it only does that and doesn't handle full domains.
Laravel Router fixes that for you so you can direct multiple domains to a single Laravel project and handle them all at once. Simply define a route group with the {domain}
pattern and use it in your callback or controller:
$this->router->group(['domain' => '{domain}'], function () {
$this->router->get('user/{id}', function ($domain, $id) {
return 'You\'re visiting from ' . $domain;
});
});
This package operates under the MIT License (MIT). Please see LICENSE for more information.
Please see CHANGELOG for more information what has changed recently.
composer install
composer test
Please see CONTRIBUTING and CONDUCT for details.
If you discover any security related issues, please email hello@sebastiaanluca.com instead of using the issue tracker.
My name is Sebastiaan and I'm a freelance Laravel developer specializing in building custom Laravel applications. Check out my portfolio for more information, my blog for the latest tips and tricks, and my other packages to kick-start your next project.
Have a project that could use some guidance? Send me an e-mail at hello@sebastiaanluca.com!