Laravel İle Dinamik Bir Web Sayfası İçin Breadcrumb Gezinme Menüsü Nasıl Yapılır?

Laravel İle Dinamik Bir Web Sayfası İçin Breadcrumb Gezinme Menüsü Nasıl Yapılır?
Laravel İle Dinamik Bir Web Sayfası İçin Breadcrumb Gezinme Menüsü Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu eğitim, Laravel 11 ve üzeri sürümlerle tam uyumlu olacak şekilde hazırlanmıştır. Çalışmaya başlamadan önce sisteminizde PHP 8.2+ ve Composer'ın kurulu olduğundan emin olmalısınız. Breadcrumb yapısını yönetmek için harici bir paket kullanmak yerine, Laravel'in kendi "View Composer" yapısını kullanacağız; bu sayede projenize gereksiz bağımlılıklar eklemeden hafif ve hızlı bir çözüm elde edeceksiniz.

  • Laravel 11+ Framework
  • Composer paket yöneticisi
  • Temel düzeyde Blade şablon bilgisi
  • Route (yönlendirme) isimleri hakkında temel bilgi

Adım 1: Breadcrumb Mantığını Tanımlama

Breadcrumb yapısının dinamik olması için her rotanın bir "breadcrumb" bilgisine sahip olması gerekir. Bunun en temiz yolu, rotalarınızı tanımlarken "breadcrumb" isminde özel bir anahtar kullanmaktır. Bu sayede her sayfaya özel başlıkları kolayca yönetebilirsiniz.

// routes/web.php
Route::get('/kategori/{slug}', [CategoryController::class, 'show'])
    ->name('category.show')
    ->breadcrumb('Kategoriler', 'category.index');

Yukarıdaki örnekte, rotaya eklediğimiz özel bir tanımlama ile breadcrumb zincirini oluşturmaya başlıyoruz. Ancak Laravel'in varsayılan router'ı bu anahtarı doğrudan tanımaz; bu yüzden bir "Macro" tanımlamamız gerekecek.

Adım 2: Route Macro ile Breadcrumb Desteği Ekleme

Laravel'in Route sınıfına yeni bir yöntem ekleyerek, rotalarımıza breadcrumb verisi atayabiliriz. Bu işlem, uygulamanızın servis sağlayıcıları içerisinde yapılmalıdır.

// app/Providers/AppServiceProvider.php
use Illuminate\Support\Facades\Route;

public function boot(): void
{
    Route::macro('breadcrumb', function ($title, $parent = null) {
        return $this->defaults(['breadcrumb' => ['title' => $title, 'parent' => $parent]]);
    });
}

Bu kod bloğu, tüm rotalarınıza breadcrumb() metodunu ekler. Böylece her rotaya bir başlık ve bir üst rota tanımlayarak hiyerarşik bir yapı oluşturabilirsiniz.

Adım 3: Breadcrumb Servisi Oluşturma

Breadcrumb verisini işlemek ve mevcut rotadan kök dizine kadar olan zinciri oluşturmak için bir servis sınıfı oluşturmalıyız. Bu sınıf, rotaların hiyerarşisini takip ederek bir dizi (array) döndürecektir.

// app/Services/BreadcrumbService.php
namespace App\Services;

use Illuminate\Support\Facades\Route;

class BreadcrumbService {
    public function generate() {
        $breadcrumbs = [];
        $currentRoute = Route::current();
        
        while ($currentRoute) {
            $data = $currentRoute->defaults['breadcrumb'] ?? null;
            if ($data) {
                $breadcrumbs[] = [
                    'title' => $data['title'],
                    'url' => route($currentRoute->getName())
                ];
                $currentRoute = $data['parent'] ? Route::getRoutes()->getByName($data['parent']) : null;
            } else {
                break;
            }
        }
        return array_reverse($breadcrumbs);
    }
}

Bu servis, mevcut rotadan başlayarak parent anahtarı üzerinden geriye doğru tüm üst rotaları toplar ve bunları düzgün bir sıra ile döndürür.

Adım 4: View Composer ile Veriyi Blade'e Aktarma

Breadcrumb verisini her controller içinde manuel olarak çağırmak yerine, bir View Composer kullanarak tüm şablonlarda otomatik olarak erişilebilir kılmalıyız.

// app/Providers/ViewServiceProvider.php
use App\Services\BreadcrumbService;
use Illuminate\Support\Facades\View;

public function boot(): void
{
    View::composer('layouts.app', function ($view) {
        $view->with('breadcrumbs', (new BreadcrumbService())->generate());
    });
}

Bu işlem, layouts.app dosyasını kullanan tüm sayfalarda $breadcrumbs değişkeninin hazır olmasını sağlar.

Adım 5: Blade Şablonunda Breadcrumb'ı Görüntüleme

Şimdi elde ettiğimiz veriyi kullanıcıya şık bir şekilde gösterme zamanı. Blade şablonunuzda döngü kullanarak listeyi oluşturabilirsiniz.


    

Bu yapı, Bootstrap veya Tailwind CSS ile kolayca stilize edilebilir. Erişilebilirlik (Accessibility) için aria-label kullanımı oldukça önemlidir.

Karşılaştırma: Breadcrumb Yöntemleri

Yöntem Avantaj Dezavantaj
Manuel (Hardcoded) Çok basit Bakımı zor, hata payı yüksek
Route Macro (Bu rehber) Merkezi yönetim, dinamik Başlangıçta kurulum gerektirir
Paket Kullanımı Hızlı kurulum Proje şişkinliği, güvenlik riski
Kritik Güvenlik Uyarısı: Rota tanımlamalarında kullanıcıdan gelen verileri (örneğin ID veya Slug) breadcrumb başlığı olarak doğrudan kullanırken mutlaka e() fonksiyonu ile XSS (Cross-Site Scripting) koruması sağlayın. Asla kullanıcı girdisini temizlemeden HTML çıktısına yansıtmayın.

Sıkça Sorulan Sorular

Breadcrumb'da dinamik verileri (örneğin ürün adı) nasıl gösteririm?

BreadcrumbService sınıfınızda, rotadaki parametreleri (örneğin {id}) yakalayıp veritabanı sorgusu ile başlığı dinamik olarak çekebilirsiniz.

Çok dilli (Localization) sitelerde breadcrumb nasıl yönetilir?

Breadcrumb başlıklarını doğrudan string yerine __('messages.home') gibi çeviri anahtarlarıyla tanımlayarak Laravel'in dil dosyalarıyla entegre edebilirsiniz.

Breadcrumb'ın SEO'ya katkısı nedir?

Arama motorları, breadcrumb yapısını sitenizin hiyerarşisini anlamak için kullanır. Doğru yapılandırılmış bir breadcrumb, Google arama sonuçlarında sayfanızın daha iyi görünmesini sağlar.

Neden View Composer kullanmalıyım?

Her controller içinde aynı mantığı tekrar etmek yerine, veriyi merkezi bir noktadan yönetmek kod tekrarını (DRY prensibi) önler ve bakımı kolaylaştırır.

Hata ayıklama (debug) için ne yapmalıyım?

Eğer breadcrumb görünmüyorsa, dd($breadcrumbs) komutunu kullanarak View Composer'dan gelen veriyi kontrol edebilir ve rotalarınızdaki breadcrumb tanımlamalarının doğru olup olmadığını teyit edebilirsiniz.

Breadcrumb Yapısında Performans Optimizasyonu

Dinamik breadcrumb yapıları, özellikle veritabanı sorgularının yoğun olduğu sayfalarda performans darboğazlarına yol açabilir. Her sayfa yüklemesinde veritabanına giderek kategori veya ürün ağacını çekmek, sorgu sayısını gereksiz yere artırır. Bu durumu engellemek için Laravel'in önbellekleme (caching) mekanizmasını kullanmak en etkili yöntemdir.

Breadcrumb verilerini önbelleğe alırken, verinin güncellendiği durumlarda önbelleği temizlemeyi (cache invalidation) unutmamalısınız. Aşağıdaki örnekte, bir kategori ağacının nasıl önbelleğe alınabileceğini görebilirsiniz:

use Illuminate\Support\Facades\Cache;

public function getBreadcrumbs($categoryId)
{
    return Cache::remember("breadcrumbs_category_{$categoryId}", 3600, function () use ($categoryId) {
        // Veritabanı sorgusu burada gerçekleşir
        return Category::ancestorsAndSelf($categoryId);
    });
}

Bu yaklaşım, özellikle derinlemesine iç içe geçmiş kategorilerde (nested sets) veritabanı üzerindeki yükü ciddi oranda azaltır. Ayrıca, View Composer içerisinde yapılan sorguları eager loading (with() metodu) kullanarak optimize etmek, N+1 problemine karşı alacağınız en temel önlemdir.

Breadcrumb Yapısı İçin Birim Testleri (Unit Testing)

Breadcrumb sisteminizin hatasız çalıştığından emin olmak için Laravel'in yerleşik test araçlarını kullanmalısınız. Bir breadcrumb testinde, belirli bir rotaya gidildiğinde beklenen dizin yapısının DOM içerisinde yer alıp almadığını kontrol edebilirsiniz.

Aşağıdaki test örneği, breadcrumb'ın doğru linkleri ve metinleri içerip içermediğini doğrular:

public function test_breadcrumb_displays_correct_path()
{
    $response = $this->get('/kategori/elektronik/telefon');

    $response->assertStatus(200);
    $response->assertSee('Anasayfa');
    $response->assertSee('Elektronik');
    $response->assertSee('Telefon');
}

Daha karmaşık senaryolar için, breadcrumb servisinizin döndürdüğü diziyi doğrudan test edebilirsiniz. Servis sınıfınızı App\Services\BreadcrumbService olarak tanımladıysanız, bu sınıfın döndürdüğü koleksiyonun beklenen URL yapısıyla eşleşip eşleşmediğini kontrol eden bir birim testi yazmak, kodunuzun refactoring süreçlerinde bozulmasını engeller.

İleri İpuçları: Schema.org ile Zenginleştirme

Breadcrumb yapınızı Google gibi arama motorları için daha anlamlı hale getirmek istiyorsanız, BreadcrumbList şemasını HTML içine gömmeniz gerekir. Bunu yaparken json-ld formatını kullanmak, sayfa tasarımınızı bozmadan SEO verisi sağlamanın en temiz yoludur.


{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [{
    "@type": "ListItem",
    "position": 1,
    "name": "Anasayfa",
    "item": "{{ url('/') }}"
  },{
    "@type": "ListItem",
    "position": 2,
    "name": "Elektronik",
    "item": "{{ url('/elektronik') }}"
  }]
}

Bu kod bloğunu ana breadcrumb şablonunuza ekleyerek, arama sonuçlarında sitenizin hiyerarşik yapısının görünürlüğünü artırabilirsiniz.

Sonuç

Laravel ile dinamik bir breadcrumb yapısı kurmak, projenizin profesyonelliğini ve kullanıcı deneyimini doğrudan artıran bir adımdır. Bu rehberde öğrendiğiniz Route Macro ve View Composer yöntemleri, Laravel'in temel prensiplerine sadık kalan, sürdürülebilir ve temiz bir çözüm sunar. Bir sonraki adım olarak, breadcrumb yapınıza JSON-LD (Schema.org) yapılandırılmış veri desteği ekleyerek arama motorlarının sitenizi daha iyi anlamasını sağlayabilirsiniz.

Sorumluluk Reddi: Bu rehberdeki kod örnekleri genel eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce kodlarınızı kendi uygulama mimarinize göre test edin, güvenlik açıklarına karşı gerekli kontrolleri yapın ve bağımlılıklarınızı güncel tutun.
Bu yazıya tepkinizi paylaşın:
Zeynep Kaya

Hobi projeleri ve kendin yap (DIY) içerikleri üzerine uzmanlaşmış bir içerik editörüyüm. Adım adım rehberlerle okuyucuların teknik becerilerini geliştirmelerine yardımcı oluyorum.

Yorumlar (0)

Yorum Yaz