tomhart / laravel-route-from-model
Laravel Route From Model
Requires
- php: ^7.2
- illuminate/routing: ~5.5.0|~5.6.0|~5.7.0|~5.8.0|^6.0
- illuminate/support: ~5.5.0|~5.6.0|~5.7.0|~5.8.0|^6.0
- tomhart/array-from-object: ^1.0
Requires (Dev)
- orchestra/testbench: ^3.8 || ^4.0
- phpstan/phpstan: ^0.12.0
- phpunit/phpunit: ^8.0
- squizlabs/php_codesniffer: *
This package is auto-updated.
Last update: 2025-03-29 01:01:12 UTC
README
This library allows a route to be built just from a Model
instance, automatically pulling out the parameters, rather
than having to manually pass them.
Simple Example
Imagine a route called test
:
Route::get('/test/{name}')->name('test');
Calling:
route_from_model('test', SomeModel::find(1));
will successfully build the route, as name
is an attribute on SomeModel
that can be retrieved.
Now imagine you want to change the route to be:
Route::get('/test/{name}/id/{id}/{seo_slug}')->name('test');
Using the default route building in Laravel, you'd need to manually go to everywhere the route
is built, and specify what/where the extra id
and seo_slug
data should come from. Providing they
exist on SomeModel
, using the exact same route_from_model
call above, it will automatically be able
to build the route without you needing to change anything.
Relationship
Using route_from_model
, you're also able to automatically get data from model relationships too, by using ->
Route::get('/test/{name}/{id}/{parent->relationship->value}/{slug}/{child->value}')->name('test');
Providing all those relationships/attributes exist, route_from_model
will be able to build the URL.
And the route will successfully change, as all the extra parts can be extracted from the Model
.
Trait
You can also add the BuildRouteTrait
to your model, and providing the model has a
private $routeName = 'test';
property, you can build a route using:
$route = $model->buildRoute();
Attributes and static values
You can also combine route_from_model
with static values too. Imagine the route:
Route::get('/test/{name}/{static}')->name('test');
where static isn't an attribute available on SomeModel
, you can simply pass it an array as the third parameter.
route_from_model('test', SomeModel::find(1), ['static' => 'MyValue']);