Benzersiz Link Oluşturma

Laravel Benzersiz Link Oluşturma
Laravel Benzersiz Link Oluşturma
Laravel 8 projelerinizde kullanabileceğiniz link alanını başlıktan otomatik olarak alan benzersiz bir link oluşturma işleminden bahsettim. Nasıl yapılacağına dair detayları incelemek için yazımın devamını okuyabilirsiniz.

Merhabalar,

Bu yazımda Laravel 8 projelerinizde kullanabileceğiniz link alanını başlıktan otomatik olarak alan benzersiz bir link oluşturma işleminden bahsedeceğim. Basit ve kolay bir kullanımın anlatımını yapacağım kısa bir süre sonra ise video ile destekleyeceğim. 

Öncelikle veritabanı bağlantınızı yaptığınızı ve bir tabloya bağlandığınızı varsayıyorum. Laravel projelerimde model ve veritabanı bağlantılarının kolaylığı için ingilizce isimler kullanıyorum.

Örnek olarak `products` tablosuna bağlantı kurdum. Artisan komutları ile birlikte Model oluşturalım.

php artisan make:model Product 

Oluşan model yapısı yapılan güncellemeler ile birlikte aşağıdaki gibi olacaktır.

app/Models/Product.php

<?php
  
namespace App\Models;
  
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str; // sonradan eklendi.
  
class Product extends Model
{
    use HasFactory;
    
    public $timestamps = false; // silinebilir
  
    protected $fillable = [
        'title', 'slug'
    ]; // kendi sütunlarınıza göre ayarlayabilirsiniz
    // slug alanını veritabanı kısmında NULLABLE olarak ayarlamalısınız
  
    /**
     * Modeli önyükleme işleminde slug değerini güncelle.
     */
    protected static function boot()
    {
        parent::boot();
  
        static::created(function ($product) {
            $product->slug = $product->createSlug($product->title);
            $product->save();
        });
    }
  
    /** 
     * slug değerini başlıktan alıp benzersiz şekilde
     * ayarlama fonksiyonu
     *
     * @return response()
     */
    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 ($mathces) {
                    return $mathces[1] + 1;
                }, $max);
            }
  
            return "{$slug}-2";
        }
  
        return $slug;
    }
} 

Model kısmında ön işlemleri halledip Controller oluşturma kısmına geçebiliriz.

Tekrar artisan komutları ile ProductController dosyamızı oluşturalım.

php artisan make:controller ProductController 

Komut ardından app/Http/Controllers/ProductController.php isimli dosya güncellemeler ile birlikte aşağıdaki gibi olacaktır;

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Product; // sonradan eklendi

class ProductController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        // örnek bir veri ekleme işlemi sadece başlıktan oluşan 
        // veride slug alanı otomatik olarak oluşacaktır
        $product = Product::create([
            "title" => "Furkan Giray"
        ]);
        dd($product); // silinebilir test amaçlı konuldu
    }   
}
 

Tamamıyla test amaçlı olan dosyada index fonksiyonunu kendi projenize göre şekillendirebilirsiniz. Yine işlemin doğruluğunu kontrol etmek için son olarak route dosyasına tanımlama yapabilirsiniz.

routes/web.php

<?php

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});
Route::get('/test', [App\Http\Controllers\ProductController::class, 'index']); 

Url’nin sonuna /test olarak ulaştığınızda veri ekleme işlemi yapacaktır. Her yenilediğinizde slug değerini benzersiz şekilde veri tabanına eklenecektir.

Bu şekilde projenizde her kayıt işlemi olduğunda başlık değerinden otomatik olarak bir link değeri veri tabanına eklenecek ve kaydedecektir.

Test olarak mantığı anladıysanız projeleriniz de yer verebilirsiniz.

Umarım anlaşılır olmuştur.

Mutlu Kodlamalar 🙂

0 Shares:

Benimle yorumunu paylaş;