In this tutorial you will learn about the Laravel 8 Create Unique Slug Tutorial Example and its application with practical example.
In this Laravel 8 Create Unique Slug Tutorial Example I will show you how to generate unique slug for blog posts title in laravel application. In this tutorial you will learn to generate unique slug for post title in laravel 8. In this example I will demonstrate you to generate unique slug or seo friendly slug url for post title in laravel 8. We will be using cviebrock eloquent sluggable laravel package for generating seo friendly url in laravel 8.
Laravel 8 Create Unique Slug Tutorial Example
In this step by step tutorial I will demonstrate you how to generate unique slug in laravel application. Please follow instruction given below:
- Step 1 – Install Laravel 8 App
- Step 2 – Connecting App to Database
- Step 3 – Install Eloquent Sluggable Package
- Step 4 – Build Model and Migration
- Step 5 – Add Routes
- Step 6 – Create Controller using Artisan Command
- Step 7 – Create the blade view
- Step 8 – Start Development Server
Step 1 – Install Laravel 8 App
First of all we need to create a fresh laravel project, download and install Laravel using the below command
1 |
composer create-project --prefer-dist laravel/laravel Blog |
Step 2 – Connecting App to Database
Now, lets create a MySQL database and connect it with laravel application. After creating database we need to set database credential in application’s .env file.
1 2 3 4 5 6 |
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=here your database name here DB_USERNAME=here database username here DB_PASSWORD=here database password here |
Step 3 – Install Eloquent Sluggable Package
In this step, we will install Eloquent Sluggable Package via the composer dependency manager. Use the following command to install Eloquent Sluggable Package.
1 |
composer require cviebrock/eloquent-sluggable |
After installing eloquent sluggable package, run the following command:
1 |
php artisan vendor:publish --provider="Cviebrock\EloquentSluggable\ServiceProvider" |
Step 4 – Build Model and Migration
Now, in this step we will create model and migration file. Please run the following command:
1 |
php artisan make:model Post -m |
The above command will create a model name Post and also create a migration file for the post table. Now put the following code in it:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreatePostsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('posts', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->string('slug'); $table->text('description'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('posts'); } } |
Now, in this step we will create model and migration file. Please run the following command:
1 |
php artisan migrate |
Now, add the fillable property in Post.php file, which is placed inside app/models directory:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Post extends Model { use HasFactory; protected $fillable = [ 'title', 'slug', 'description', ]; public function sluggable() { return [ 'slug' => [ 'source' => 'title' ] ]; } } |
Step 5 – Add Routes
After this, we need to define routes in “routes/web.php” file. Lets open “routes/web.php” file and add the following routes in it.
routes/web.php
1 2 3 4 5 6 7 |
<?php Route::get('/', function () { return view('welcome'); }); Route::resource('posts', 'PostController'); |
Step 6 – Create Controller using Artisan Command
Now, lets create a controller named PostController using command given below –
1 |
php artisan make:controller PostController |
Now, go to app/HTTP/Controller directory and open PostController.php file. And put the following code into it:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
<?php namespace App\Http\Controllers; use App\Models\Post; use Illuminate\Http\Request; use Redirect; use Cviebrock\EloquentSluggable\Services\SlugService; class PostController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { $data['post'] = Post::orderBy('id','desc')->paginate(10); return view('post.list',$data); } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { return view('post.create'); } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { $request->validate([ 'title' => 'required', 'description' => 'required', ]); $insert = [ 'slug' => SlugService::createSlug(Post::class, 'slug', $request->title), 'title' => $request->title, 'description' => $request->description, ]; Post::insertGetId($insert); return Redirect::to('posts') ->with('success','Greate! posts created successfully.'); } /** * Display the specified resource. * * @param \App\Post $post * @return \Illuminate\Http\Response */ public function show(Request $request) { } /** * Show the form for editing the specified resource. * * @param \App\Post $post * @return \Illuminate\Http\Response */ public function edit($id) { } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param \App\Post $post * @return \Illuminate\Http\Response */ public function update(Request $request, $id) { } /** * Remove the specified resource from storage. * * @param \App\Post $post * @return \Illuminate\Http\Response */ public function destroy($id) { } } |
Step 7 – Create the blade view
Now we will create following blade files:
- List.blade.php
- Create.blade.php
List.blade.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <meta name="csrf-token" content="{{ csrf_token() }}"> <title>Laravel 8 Generate Unique Slug For Post With Example</title> <link href="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css"> <style> body{ background-color: #25274d; } .container{ background: #ff9b00; padding: 4%; border-top-left-radius: 0.5rem; border-bottom-left-radius: 0.5rem; } </style> </head> <body> <div class="container"> <a href="{{ route('posts.create') }}" class="btn btn-success mb-2">Add Post</a> <br> <div class="row"> <div class="col-12"> <table class="table table-bordered" id="laravel_unique_slug_table"> <thead> <tr> <th>Id</th> <th>Title</th> <th>Slug</th> <th>Description</th> </tr> </thead> <tbody> @foreach($posts as $post) <tr> <td>{{ $post->id }}</td> <td>{{ $post->title }}</td> <td>{{ $post->slug }}</td> <td>{{ $post->description }}</td> </tr> @endforeach </tbody> </table> {!! $posts->links() !!} </div> </div> </div> </body> </html> |
Create.blade.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <meta name="csrf-token" content="{{ csrf_token() }}"> <title>Laravel 8 Create Post With Unique Slug</title> <link href="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css"> <style> body{ background-color: #25274d; } .container{ background: #ff9b00; padding: 4%; border-top-left-radius: 0.5rem; border-bottom-left-radius: 0.5rem; } </style> </head> <body> <div class="container"> <form action="{{ route('posts.store') }}" method="POST" name="add_post"> {{ csrf_field() }} <div class="row"> <div class="col-md-12"> <div class="form-group"> <strong>Title</strong> <input type="text" name="title" class="form-control" placeholder="Enter Title"> <span class="text-danger">{{ $errors->first('title') }}</span> </div> </div> <div class="col-md-12"> <div class="form-group"> <strong>Description</strong> <textarea class="form-control" col="4" name="description" placeholder="Enter Description"></textarea> <span class="text-danger">{{ $errors->first('description') }}</span> </div> </div> <div class="col-md-12"> <button type="submit" class="btn btn-primary">Submit</button> </div> </div> </form> </div> </body> </html> |
Step 8 – Run Development Server
Now we are ready to run our example so lets start the development server using following artisan command –
1 |
php artisan serve |
Now, open the following URL in browser to see the output –
1 |
http://localhost:8000/posts |