# TYPO3 Routing Enhancers & Slugs

TYPO3 v13'te SEO dostu URL yapıları, route enhancer'lar ve slug yönetimini kapsar.

---

## Slug (URL Yolu) Nedir?

Slug, sayfanın URL yolunu belirler. TYPO3 her sayfa için otomatik slug oluşturur.

**Örnek:** "Hakkımızda" sayfası → `/hakkimizda`

### Slug Yapılandırması

Backend'de **Web > Page** modülünde her sayfanın **SEO** veya **General** sekmesinde slug alanı bulunur.

### Otomatik Slug Oluşturma

```bash
# Tüm sayfaların slug'larını yeniden oluştur
ddev exec vendor/bin/typo3 redirects:checkintegrity
```

---

## Route Enhancers

Route Enhancer'lar, eklenti URL parametrelerini SEO dostu URL'lere dönüştürür.

### config.yaml Yapılandırması

`config/sites/main/config.yaml`:

```yaml
base: 'https://example.com/'
rootPageId: 1

routeEnhancers:

  # Sayfa numaralandırma (Pagination)
  PageTypeSuffix:
    type: PageType
    default: /
    index: ''
    map:
      /: 0

  # News Extension Route Enhancer
  News:
    type: Extbase
    extension: News
    plugin: Pi1
    routes:
      -
        routePath: '/{news-title}'
        _controller: 'News::detail'
        _arguments:
          news-title: news
      -
        routePath: '/sayfa/{page}'
        _controller: 'News::list'
        _arguments:
          page: '@widget_0/currentPage'
    defaultController: 'News::list'
    aspects:
      news-title:
        type: PersistedAliasMapper
        tableName: tx_news_domain_model_news
        routeFieldName: path_segment
      page:
        type: StaticRangeMapper
        start: '1'
        end: '100'

  # Form Extension
  Form:
    type: Extbase
    extension: Form
    plugin: Formframework
    routes: []
    defaultController: 'FormFrontend::perform'
```

---

## Enhancer Türleri

### 1. Simple Enhancer

Basit parametre eşlemesi:

```yaml
routeEnhancers:
  ProductDetail:
    type: Simple
    routePath: '/urun/{product}'
    aspects:
      product:
        type: PersistedAliasMapper
        tableName: tx_myext_product
        routeFieldName: slug
```

### 2. Extbase Enhancer

Extbase eklentileri için:

```yaml
routeEnhancers:
  BlogPosts:
    type: Extbase
    extension: Blog
    plugin: Posts
    routes:
      -
        routePath: '/{post-slug}'
        _controller: 'Post::show'
        _arguments:
          post-slug: post
    defaultController: 'Post::list'
    aspects:
      post-slug:
        type: PersistedAliasMapper
        tableName: tx_blog_domain_model_post
        routeFieldName: slug
```

### 3. Plugin Enhancer

Plugin bazlı parametreler için:

```yaml
routeEnhancers:
  SearchPlugin:
    type: Plugin
    namespace: tx_search
    routePath: '/arama/{sword}'
    aspects:
      sword:
        type: StaticValueMapper
        map: {}
```

---

## Aspect Türleri

| Aspect | Açıklama | Kullanım |
|--------|----------|----------|
| `PersistedAliasMapper` | Veritabanındaki slug/alias ile eşleme | Kayıt detay sayfaları |
| `PersistedPatternMapper` | Pattern ile veritabanı eşleme | Karmaşık URL yapıları |
| `StaticValueMapper` | Sabit değer eşlemesi | Bilinen parametre değerleri |
| `StaticRangeMapper` | Sayısal aralık eşlemesi | Sayfalama (1-100) |
| `LocaleModifier` | Dil bazlı URL çevirisi | Çok dilli siteler |

### Aspect Örnekleri

```yaml
aspects:
  # Veritabanından slug eşleme
  news-title:
    type: PersistedAliasMapper
    tableName: tx_news_domain_model_news
    routeFieldName: path_segment

  # Sabit değer eşleme
  category:
    type: StaticValueMapper
    map:
      teknoloji: 1
      spor: 2
      kultur: 3

  # Sayı aralığı
  page:
    type: StaticRangeMapper
    start: '1'
    end: '99'

  # Dil bazlı eşleme
  archive:
    type: LocaleModifier
    default: 'archive'
    localeMap:
      -
        locale: 'tr_TR.*'
        value: 'arsiv'
      -
        locale: 'de_DE.*'
        value: 'archiv'
```

---

## Yaygın Kullanım Senaryoları

### Haber Detay Sayfası

```yaml
routeEnhancers:
  NewsDetail:
    type: Extbase
    extension: News
    plugin: Pi1
    routes:
      -
        routePath: '/{news-title}'
        _controller: 'News::detail'
        _arguments:
          news-title: news
    defaultController: 'News::list'
    aspects:
      news-title:
        type: PersistedAliasMapper
        tableName: tx_news_domain_model_news
        routeFieldName: path_segment
```

**Sonuç:** `/haberler/typo3-v13-yayinlandi`

### Sayfalama

```yaml
routeEnhancers:
  NewsPagination:
    type: Extbase
    extension: News
    plugin: Pi1
    routes:
      -
        routePath: '/sayfa/{page}'
        _controller: 'News::list'
        _arguments:
          page: currentPage
    defaultController: 'News::list'
    aspects:
      page:
        type: StaticRangeMapper
        start: '1'
        end: '50'
```

**Sonuç:** `/haberler/sayfa/2`

---

## Sorun Giderme

### URL Çözümlenemiyor

```bash
# Cache temizle
ddev exec vendor/bin/typo3 cache:flush

# Route debugger'ı aktif et (geliştirme ortamı)
```

### Slug Çakışması

TYPO3 otomatik olarak slug çakışmalarını çözer (ör: `-1` ekleyerek). Manuel müdahale için:

1. Backend'de sayfanın slug alanını düzenleyin
2. Eski URL için redirect oluşturun (**Site Management > Redirects**)

---

## Kaynaklar

- [TYPO3 Routing](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/SiteHandling/Routing.html)
- [Route Enhancers](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/SiteHandling/UsingEnhancers.html)
