sebastiaanluca / laravel-route-model-autobinding
Automatically bind Eloquent models to be used as route segments.
Installs: 2 809
Dependents: 1
Suggesters: 0
Security: 0
Stars: 14
Watchers: 1
Forks: 0
Open Issues: 0
Requires
- php: ^7.3
- laravel/framework: ^7.0|^8.0
Requires (Dev)
- kint-php/kint: ^3.3
- mockery/mockery: ^1.3
- orchestra/testbench: ^5.1|^6.0
- phpunit/phpunit: ^8.5
README
Immediately start using models in your routes without having to worry about maintaining any list or map.
Medium to large Laravel applications can have a lot of models. If you're a heavy user of route model binding to automatically retrieve and inject model instances in your controllers, that means you have to manually register dozens or hundreds of models in your route service provider. You then need to do the same for each new, changed, or deleted model which makes this nifty feature hard to maintain and easy to forget.
This package solves the issue of manually having to register each model by doing all the grunt work for you. It reads your composer.json
PSR-4 autoload section and scans all their model directories for usable Eloquent models. It then explicitly binds each model into the router as a route segment variable using a case type of your choosing (see configuring casing).
Example
Get rid of this boilerplate code:
public function boot() : void { Route::model('user', \App\Users\User::class); Route::model('order', \App\Orders\Order::class); Route::model('shoppingCart', \App\Carts\Cart::class); Route::model('Item', \App\Item::class); Route::model('Admin', \App\Users\Admin::class); … (repeat dozens of times) }
And just do this (for any Eloquent model in your application):
Route::get('profile/{user}', ShowProfile::class); Route::get('orders/{order}', ShowOrder::class); Route::get('carts/{shoppingCart}', ShowShoppingCart::class); …
Table of contents
- Requirements
- How to install
- How to use
- License
- Change log
- Testing
- Contributing
- Security
- Credits
- About
Requirements
- PHP 7.3 or higher
- Laravel 7.0 or higher
How to install
Via Composer:
composer require sebastiaanluca/laravel-route-model-autobinding
How to use
Defining model namespaces
Laravel route model autobinding uses your composer.json
PSR-4 autoload section to know which namespaces and paths to scan. In any new Laravel project, the default App\\
namespace is already in place, so for most projects no additional setup required. If you have other namespaces registered like local modules or (dev) packages, those will be scanned too.
{ "autoload": { "psr-4": { "App\\": "app/", "MyModule\\": "modules/MyModule/", "MyPackage\\": "MyPackage/src/" } } }
Furthermore it filters out traits, abstract classes, helper files, and other unusable items to only bind valid Eloquent models.
Route segment variables
After installing the package, you can immediately get to work using the aliased Eloquent models in your routes:
Route::get('profile/{user}', ShowProfile::class); Route::get('orders/{order}', ShowOrder::class); Route::get('carts/{shoppingCart}', ShowShoppingCart::class); …
Besides scanning and aliasing your models for you, this package alters no native Laravel functionality. Therefore, see the Laravel documentation on how to use route model injection.
Caching bindings in production
To cache all bindings and speed up your application in production, add the cache command to your deploy scripts:
php artisan autobinding:cache
This scans all your current models and writes a static cache file to the bootstrap/cache
directory. Upon subsequent framework booting, it reads the cache file instead of scanning and aliasing on-the-fly.
Note that this thus disables runtime scanning, meaning new models will not be recognized and changes to existing models will not be reflected (not very handy during development). You can however still change the case type in the configuration file, as the binding happens in a later stage.
To clear the cache file, run:
php artisan autobinding:clear
Configuration
Run
php artisan vendor:publish
and select
laravel-route-model-autobinding (configuration)
to publish the configuration file.
Casing
By default, the case type for aliasing models is set to camel case. You can change this to use camel, snake, or studly casing.
See \SebastiaanLuca\RouteModelAutobinding\CaseTypes
for possible options.
Camel case (default):
Route::get('carts/{shoppingCart}', ShowShoppingCart::class);
Snake case:
Route::get('carts/{shopping_cart}', ShowShoppingCart::class);
Studly case:
Route::get('carts/{ShoppingCart}', ShowShoppingCart::class);
The case type can still be changed after caching your models.
License
This package operates under the MIT License (MIT). Please see LICENSE for more information.
Change log
Please see CHANGELOG for more information what has changed recently.
Testing
composer install
composer test
Contributing
Please see CONTRIBUTING and CODE OF CONDUCT for details.
Security
If you discover any security related issues, please email hello@sebastiaanluca.com instead of using the issue tracker.
Credits
About
My name is Sebastiaan and I'm a freelance back-end 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!