arakibi
arakibi

Reputation: 447

show name instead of id in a url using laravel routing

I have defined a route in laravel 4 that looks like so :

Route::get('/books/{id}', 'HomeController@showBook');

in the url It shows /books/1 for example , now i'm asking is there a way to show the name of the book instead but to keep also the id as a parameter in the route for SEO purposes

thanks in advance

Upvotes: 6

Views: 7375

Answers (4)

Arnoldkk
Arnoldkk

Reputation: 587

You can also use model binding check more on laravel docs

For example

Route::get('book/{book:name}',[BookController::class,'getBook'])->name('book');

The name attribute in "book/{book:name}" should be unique.

Upvotes: 0

Arnoldkk
Arnoldkk

Reputation: 587

if your using laravel 8, this may be helpfull.
In your Controller add this

public function show(Blog $blog)
{
    return view('dashboard.Blog.show',compact('blog'));
}

In your web.php add this

Route::get('blog/{blog}', [\App\Http\Controllers\BlogController::class,'show'])->name('show');

Then add this to your model (am using Blog as my Model)

 public function getRouteKeyName()
{
    return 'title'; // db column name you would like to appear in the url.
}

Note: Please let your column name be unique(good practice).
Result: http://127.0.0.1:8000/blog/HelloWorld .....url for a single blog
So no more http://127.0.0.1:8000/blog/1
You are welcome.

Upvotes: 1

Alessandro Boselli
Alessandro Boselli

Reputation: 11

You could also do something like this:

Route::get('books/{name}', function($name){
    $url = explode("-", $name);
    $id = $url[0];
    return "Book #$id";
});

So you can get book by id if you pass an url like: http://website.url/books/1-book-name

Upvotes: 1

Jerodev
Jerodev

Reputation: 33186

You can add as many parameters to the url as you like, like this:

Route::get('/books/{id}/{name}', 'HomeController@showBook');

Now when you want to create an url to this page you can do the following:

URL::action('HomeController@showBook', ['id' => 1, 'name' => 'My awesome book']);

Update:

If you are certain that there will never be two books with the same title, you can just use the name of the book in the url. You just need to do this:

Route::get('/books/{name}', 'HomeControllers@showBook');

In your showBook function you need to get the book from the database using the name instead of the id. I do strongly encourage to use both the id and the name though because otherwise you can get in trouble because I don't think the book name will always be unique.

Upvotes: 0

Related Questions