Далеко не всех устраивает, если ссылки на сайте содержат ID (/blog/1), намного более привлекательный вид имеют человеко понятные url'ы (/blog/my_first_title).
Далее будет описание как добавить ЧПУ в проект на Laravel.
Код ниже приводиться для Laravel версии 6.
Устанавливаем eloquent-sluggable
composer require cviebrock/eloquent-sluggable:^6.0
Если используется актуальная версия Laravel, то запускать стоит просто без указания версии:
composer require cviebrock/eloquent-sluggable
Добавляем в таблицу постов новое поле slug. Создаем миграцию:
php artisan make:migration add_slug_to_posts
В файл database/migrations/2020_08_20_122513_add_slug_to_posts.php вносим:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddSlugToPosts extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('posts', function (Blueprint $table) {
$table->string('slug');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('posts', function (Blueprint $table) {
$table->dropColumn('slug');
});
}
}
Запускаем миграцию:
Теперь в модель постов (например, app/Post.php), добавляем:
use Cviebrock\EloquentSluggable\Sluggable;
use Sluggable;
и метод
public function sluggable()
Полный код:
use Cviebrock\EloquentSluggable\Sluggable;
class Post extends Model
{
use Sluggable;
/**
* Return the sluggable configuration array for this model.
*
* @return array
*/
public function sluggable()
{
return [
'slug' => [
'source' => 'title'
]
];
}
}
Вносим изменения в маршруты (/routes/web.php):
// Route::get('/blog/{id}', 'BlogController@show')->name('blog.show');
Route::get('/blog/{slug}', 'BlogController@show')->name('blog.show');
Также изменяем контроллер (/app/Http/Controllers/BlogController.php), метод show:
// public function show($id)
public function show($slug)
{
// $post = Post::where('id', $id)->where('published', 1)->firstOrFail();
$post = Post::where('slug', $slug)->where('published', 1)->firstOrFail();
И поправляем вывод ссылок на сами посты (например, /resources/views/blog/posts.blade.php):
<a href="{{route('blog.show', $post->id)}}">{{$post->title}}</a> {{$post->ru_date}}
<a href="{{route('blog.show', $post->slug)}}">{{$post->title}}</a> {{$post->ru_date}}