Dalam membuat slug di laravel, kita dapat menggunakan metode Str::slug
untuk menghasilkan atau merubah string biasa menjadi bentuk slug, seperti di bawah ini:
$slug = Str::slug('Cara Membuat Slug di Laravel', '-'); // cara-membuat-slug-di-laravel
Selain itu, dalam pembuatannya, kita juga perlu menyediakan kolom khusus pada tabel database untuk menyimpan slug yang dibuat, dan yang akan dipanggil ketika melakukan query untuk dijadikan sebagai parameter.
Cara pembuatannya sendiri cukup mudah. Sebagai contoh, dan cara penggunaannya, berikut adalah langkah-langkah dalam membuat slug di laravel.
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 halaman. 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 silakan 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 mana yang ingin digunakan, seperti ID atau slug.
Untuk menggunkannya, kita tambahkan metode getRouteKeyName()
seperti dibawah pada file model Post.php
.
//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');
Selesai. Silahkan coba buka kembali link yang ada.
Selesai
Demikian cara membuat slug di laravel. Silahkan dicoba dan dikembangkan.