Y ü k l e n i y o r
Laravel - Benzersiz Link Oluşturma

Laravel - Benzersiz Link Oluşturma

Laravel Projelerinde Başlıktan Otomatik Slug Oluşturma

Merhabalar,

Bu yazımda Laravel 8 projelerinizde, bir başlıktan otomatik olarak benzersiz slug (link) değeri oluşturmayı göstereceğim. Hem SEO uyumlu, hem de kullanımı oldukça basit bir yapıdır. Kısa süre içinde video desteği de gelecektir.

Veritabanı bağlantınızın yapıldığını ve bir tabloya bağlı olduğunuzu varsayıyorum. Ben Laravel projelerimde model ve tablo adlarını İngilizce kullanıyorum. Örnekte products tablosunu kullanacağız.

Artisan ile Model Oluşturma:

php artisan make:model Product

Model dosyası app/Models/Product.php konumunda yer alacak. Şu şekilde güncelliyoruz:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class Product extends Model
{
    use HasFactory;

    public $timestamps = false; // opsiyonel

    protected $fillable = [
        'title', 'slug'
    ]; // sütunlarınıza göre düzenleyin

    // slug sütunu veritabanında NULLABLE olmalı

    protected static function boot()
    {
        parent::boot();

        static::created(function ($product) {
            $product->slug = $product->createSlug($product->title);
            $product->save();
        });
    }

    /**
     * Başlıktan benzersiz slug üret
     */
    private function createSlug($title)
    {
        if (static::whereSlug($slug = Str::slug($title))->exists()) {
            $max = static::whereTitle($title)->latest('id')->skip(1)->value('slug');
            if (is_numeric($max[-1])) {
                return preg_replace_callback('/(\d+)$/', function ($matches) {
                    return $matches[1] + 1;
                }, $max);
            }
            return "{$slug}-2";
        }

        return $slug;
    }
}

Artisan ile Controller Oluşturma:

php artisan make:controller ProductController

app/Http/Controllers/ProductController.php dosyasına aşağıdaki gibi örnek bir içerik ekliyoruz:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Product;

class ProductController extends Controller
{
    public function index()
    {
        // Sadece başlık ile veri oluşturuluyor
        // slug otomatik olarak üretilecek
        $product = Product::create([
            'title' => 'Furkan Giray'
        ]);

        dd($product); // test amacıyla
    }
}

Route Tanımı:

<?php

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

Route::get('/test', [App\Http\Controllers\ProductController::class, 'index']);

Tarayıcınızda /test adresine gittiğinizde, veri eklenecek ve her seferinde başlığa göre benzersiz slug değeri oluşturulacaktır.

Bu yapı sayesinde kayıt sırasında başlıktan otomatik slug üretimi yapılabilir. Projenize entegre edip test ettikten sonra ihtiyaçlarınıza göre özelleştirebilirsiniz.

Mutlu Kodlamalar! :)