Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel 5.6 getRouteKeyName() not working

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.

like image 468
Danny Guest Avatar asked May 08 '18 12:05

Danny Guest


People also ask

Where is Route file in Laravel?

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 .

What is prefix in Laravel route?

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.


1 Answers

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.

like image 151
The Alpha Avatar answered Oct 17 '22 08:10

The Alpha