Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?

Merhaba,
Bir projemde lazım oldu yazayım dedim basitçe hiyerarşik rota nasıl yapabiliriz bunu yazmaya çalıştım.

Normalde bir e-ticaret sitesine girdiğinizde karşınıza çıkan url'ler kategorinin sırasına göre gider tabi bu rota tanımlaması seoda da etkilidir.

Bahsettiğimiz rota:
/oyuncaklar/pelus-oyuncaklar/ayili-pelus-oyuncaklar/....n

diye gider.

İlk olarak bir kategori tablosunun olduğunu düşünelim içerisindeki kolonlar
id, name, slug, parent_id

parent_id 0 olan ana kategori bizim örnekte oyuncaklar 0 ana kategori pelus-oyuncaklar parent_id'si ana kategorinin id'si diye hiyerarşik bir biçimde klasik nested kategori yönetimi.

Route::get('/{category}', function ($category) {
    $categories = explode('/', $category);
    $lastId = 0;

    foreach($categories as $key => $cat){
        if(DB::table('categories')->where('slug', $cat)->doesntExist() || ($key===0 && DB::table('categories')->where('slug', $cat)->first()->parent_id!=0) || ($key!=0 && DB::table('categories')->where('slug', $cat)->first()->parent_id!=$lastId)){
           abort(404);
        }

        if(($key===0 && DB::table('categories')->where('slug', $cat)->first()->parent_id===0) || ($key!=0 && DB::table('categories')->where('slug', $cat)->first()->parent_id===$lastId)){
            $lastId =  DB::table('categories')->where('slug', $cat)->first()->id;
        }
    }

    return end($categories);
})->where('category', '[A-Za-z0-9/-]+');

basitçe belirli kontroller ile son kategorinin doğru biçimde gelip gelmediğine bakar gelmişse son kategoriyi kullanmamız için slug'ını bize verir.

Kod reviewlarınızı bekliyorum.
Umarım ihtiyaç karşılar.

    • mgsmus

      Seviye 1383
    • Düzenlendi

    siradaninsan

    // Bu rota routes/web.php içinde mutlaka en alta eklenmeli.
    // Sondaki where kısmı önemli, özellikle / karakteri.
    Route::get('{slug}', [CategoryController::class, 'show'])->where('slug', '([a-z0-9-/]+)');
    public function show($slug, Request $request)
    {
        $slugs = explode('/', $slug);
    
        // Son kategori
        $last = end($slugs);
    
        $category = Category::where('slug', $last)->firstOrFail();
    
        // Son kategorinin atalarının ve kendisinin slug değerlerini dizi olarak çeken bir yöntem 
        // oluşturmanız gerekiyor. Size ['oyuncaklar', 'pelus-oyuncaklar', 'ayili-pelus-oyuncaklar'] 
        // gibi bir dizi dönmeli.
        $path = $category->getAncestorSlugs();
    
        // Orjinal yolun sırası değişmesin diye ayrı bir değişkene alıyorum. Orjinal yol breadcrumb
        // oluşturmak için kullanılabilir çünkü...
        $tmpPath = $path;
    
        sort($tmpPath);
        sort($slugs);
    
        // Kullanılan kategoriler ile son kategorinin ataları eşit değilse demek ki
        // kategori ağacı yanlış ya da dışarıdan müdahale edilmiş demektir.
        if($tmpPath != $slugs) {
            abort(404);
        }
    
        return view('categories.show', compact('category', 'path'));
    }

      Bende muhtemelen bu yolla çözerdim ama sorguları if'e gelmeden yapıp bir değişkene atayıp sonra if'te kontrol etmek okunabilirlik açısından daha iyi. İkinci if'teki lastId nerede kullanılacak? Neden sadece son category dönüyor? Açıkcası junior bunu PR'de gönderse hiç düşünmeden reddederim.

      Bir şeyleri tek satırda çözme takıntısını bir kenara bırakmamız gerekiyor bence. Özellikle laravel'de hiç iyi durmuyor.

        EgoistDeveloper lastId kullanılmayacak lastId foreach döktüğümüz için tekrarlı bir şekilde önceki id niteliği taşıyor. kontrol için oluşturduğum değişken. Son kategorinin dönmesindeki amaçta son kategoriye göre ürünleri çektiğimiz için.

        mgsmus Review için teşekkürler, değişik ve düzgün bir yaklaşım.