Kita bisa gunakan metode Str::slug
untuk menghasilkan atau merubah string yang kita tentukan menjadi bentuk slug:
$slug = Str::slug('Cara Membuat Slug di Laravel', '-'); // cara-membuat-slug-di-laravel
Kita juga perlu menyediakan kolom khusus untuk menyimpan slug yang dibuat yang akan dipanggil saat melakukan query untuk dijadikan sebagai parameter.
Untuk melihat contoh dan cara penggunaan, mari kita coba membuat slug dengan penerapan pada metode insert data serta membuat form input.
Instalasi Laravel, Database, Model, dan Tabel
Mari kita gunakan aplikasi laravel baru.
laravel new laravel-slug
Silahkan buat MySQL database baru dan hubungkan dengan aplikasi.
//env DB_DATABASE=laravel_slug DB_USERNAME=root DB_PASSWORD=
Selanjutnya kita tambahkan sebuah file migrasi baru dengan beberapa kolom termasuk kolom slug
.
php artisan make:model Post -m
//...create_posts_table.php public function up() { Schema::create('posts', function (Blueprint $table) { $table->id(); $table->string('title'); $table->string('slug'); $table->text('body'); $table->timestamps(); }); }
Kemudian kita lakukan migrasi.
pre artisan migrate
Membuat Data
Kita lanjutkan dengan membuat html form dan membuat request insert record baru. Silahkan buka file route web.php dan tambahkan di bawah ini.
use Illuminate\Http\Request; use Illuminate\Support\Str; use App\Models\Post; ... Route::post('/store', function (Request $request) { $post = new Post; $post->title = $request->title; $post->slug = Str::slug($post->title, '-'); $post->body = $request->body; $post->save(); return back(); }); Route::get('/posts', function () { $posts = Post::all(); return view('posts', ['posts' => $posts]); })->name('posts');
Kolom slug kita isi dengan value dari title, namun diubah ke bentuk 'slug' dengan penghubung -
.
Selanjutnya buka file welcome.blade.php, ubah html yang ada dengan di bawah ini.
<!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>My App - @yield('title')</title> <style> .container{margin:2rem} </style> </head> <body> <div class="container"> @yield('content') </div> </body> </html>
Kemudian buat file baru di direktori views dengan nama posts.blade.php lalu copas html di bawah ini.
@extends('welcome') @section('title', 'Create New Post | All Posts') @section('content') <h1>Create New Post</h1> <form method="POST" action="/store"> @csrf <input type="text" name="title" placeholder="title"> <input type="text" name="body" placeholder="body"> <button type="submit">Submit</button> </form> <br> <hr> <h1>All Posts</h1> @foreach ($posts as $post) <h4> {{ $post->title }} </h4> @endforeach @endsection
Jalankan aplikasi php artisan serve
, buka http://localhost:8000/posts
dan silahkan buat 'post' baru.
Kemudian lihat hasilnya di database pada tabel posts.
MariaDB [laravel_slug]> select id, title, slug from posts; +----+--------------------------+-------------------------+ | id | title | slug | +----+--------------------------+-------------------------+ | 1 | What is Lorem Ipsum? | what-is-lorem-ipsum | | 2 | Where does it come from? | where-does-it-come-from | +----+--------------------------+-------------------------+ 2 rows in set (0.001 sec)
Postingan terkait 'membuat data': Cara menyimpan data dengan relasi model terkait di laravel
Route Parameter
Setelah kita memiliki slug, tahap selanjutnya adalah bagaimana menggunakan slug tersebut sebagai url untuk mengakases data objek.
Mari kita buat route baru dengan menambahkan model eloquent terkait dengan menambahkan kolom pada parameter, seperti di bawah ini.
Route::get('/post/{post:slug}', function (Post $post) { return view('show', ['post' => $post]); })->name('show');
Lalu buka kembali file posts.blade.php, tambahkan tag a dengan route dan value slug pada title.
<h4><a href="{{ route('show', $post->slug )}}"> {{ $post->title }} </a></h4>
Kita tambahkan sebuah halalaman. Silahkan buat file baru dengan nama show.blade.php pada direktori views dan copas html berikut.
@extends('welcome') @section('title', $post->title) @section('content') <h4>< <a href="{{ route('posts')}}">Back</a> </h4> <hr> <h1>{{$post->title}}</h1> <p>{{$post->body}}</p> @endsection
Sekarang silahkan coba untuk membuka link pada halaman posts.
Menyesuaikan Kunci Parameter
Di atas, kita berhasil menggunakan slug untuk menampilkan 'post' dengan menggunakan model pada parameter route. Sebenarnya ada cara lain yang dapat kita gunakan.
Kita juga bisa menggunakan metode getRouteKeyName()
dan menentukan kolom atau key yang ingin digunakan seperti ID atau slug.
Untuk menggunkannya, silahkan tambahkan metode getRouteKeyName()
seperti dibawah pada file model Post.php
.
public function getRouteKeyName() { return 'slug'; }
Kita bisa gunakan 'id' atau 'slug'. Selanjutnya pada route, buat seperti dibawah ini.
Route::get('/post/{post}', function (Post $post) { return view('show', ['post' => $post]); })->name('show');
Silahkan coba kembali buka link yang ada.
Selesai
Demikian cara membuat slug di laravel. Silahkan dicoba dan dikembangkan.