This is the code I have so far:
Web.php
Route::get('/{uri}', 'PageController@show')->name('page.show');
PageController
// Show the requested page
public function show(Page $page)
{
return view('templates.page', compact('page'));
}
Page model
public function getRouteKeyName()
{
return 'uri';
}
My question is how come the Route-model-binding is not working and not finding the page in the controller even though I have changed the route key name. It just has an empty model in the controller and has not found the page.
The Default Route Files All Laravel routes are defined in your route files, which are located in the routes directory. These files are automatically loaded by your application's App\Providers\RouteServiceProvider .
Route Prefixes The prefix method may be used to prefix each route in the group with a given URI. For example, you may want to prefix all route URIs within the group with admin : Route::prefix('admin')->group(function () { Route::get('users', function () { // Matches The "/admin/users" URL.
You should do something like the following:
// Route
Route::get('/{page}', 'PageController@show')->name('page.show');
// Controller Method
public function show(Page $page)
{
return view('templates.page', compact('page'));
}
If /{page}
contains an id
like: 1
and your pages table has id
column then all done but if you would like to query the pages table other than an id then declare the getRouteKeyName
method in your Page
model and retuen that column name from that method. So for example, if your pages table has unique slug
and your uri
has something like example.com/contact
then declare the following method:
public function getRouteKeyName()
{
return 'slug'; // db column name
}
Now, the framework will query for a page using something like where slug = {slug from uri}
other than id
/default. Hope it helps now.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With