Laravel ЧПУ для постов (SLUG)

20.08.2020

Далеко не всех устраивает, если ссылки на сайте содержат ID (/blog/1), намного более привлекательный вид имеют человеко понятные url'ы (/blog/my_first_title).

Далее будет описание как добавить ЧПУ в проект на Laravel.

Код ниже приводиться для Laravel версии 6, но принципиальной разницы с другими версиями быть не должно.

Устанавливаем eloquent-sluggable

 
composer require cviebrock/eloquent-sluggable:^6.0

Добавляем в таблицу постов новое поле 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');
        });
    }
}

Запускаем миграцию:

 
php artisan migrate

Теперь в модель постов (например, 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}}


Категории: Web, Laravel
Яндекс.Метрика