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! :)