1 min read

Symfony2 Routing Sondaki Slash Problemi

Symfony2 ile ilgili basit bir uygulama geliştirirken routing de bir sorun yaşadım. /admin olarak belirlediğim bir adrese /admin/ olarak giriş yaptığımda ilgili routing bulunamadığı için hata aldığımı gördüm.

Aslında bu bir sorun değil. Çünkü hazırladığım routing’e göre hiç bir eşleşmesi bulunmayan bir GET isteği gelmişti. Hazırladığım routing yapısı:

# /admin
admin_default:
    pattern: admin
    defaults: {_controller: AdminBundle:Default:index}

Bu YAML kodlarına göre herhangi bir eşleşmesi bulunmayan GET isteğimi aşağıdaki gibi düzenleyerek adresin sonuna / eklense de eklenmese de çalışır hale getirebildim.

# /admin/
admin_default:
    pattern: admin{trailingSlash}
    defaults: {_controller: AdminBundle:Default:index, trailingSlash: /}
    requirements: {trailingSlash: "[/]{0,1}"}

Bu kodlarda, trailingSlash adı verilen parametreye varsayılan olarak “/” karakterini ekledik. Bunun dışında herhangi bir karakter geldiğinde çalışmaması için Regex filtresi ekledik.

Umarım faydası olur. İyi çalışmalar.

Güncelleme

Symfony2 resmi dökümantasyon sitesinde bu konuyla ilgili bir yazı paylaşılmış. Yazıya buradan ulaşmanız mümkün. Yazıda kullanılan yönteme göre, basit bir controller ekleyerek sonunda slash bulunan tüm istekleri 301 ile slash olmayan haline yönlendirebilmeniz mümkün. Bu yöntemin yukarıda anlattığım yönteme göre daha sağlıklı olduğunu söyleyebilirim.

Yeni bir bundle veya mevcut bir bundle’ın içindeki controller’a aşağıdaki metot eklenir

public function removeTrailingSlashAction(Request $request)
    {
        $pathInfo = $request->getPathInfo();
        $requestUri = $request->getRequestUri();

        $url = str_replace($pathInfo, rtrim($pathInfo, ' /'), $requestUri);

        return $this->redirect($url, 301);
    }

Bu metodun çağrılması için aşağıdaki gibi bir routing eklenir.

remove_trailing_slash:
    path: /{url}
    defaults: { _controller: AppBundle:Redirecting:removeTrailingSlash }
    requirements:
        url: .*/$
    methods: [GET]

Burada dikkat etmeniz gereken nokta, routing sadece sonunda “/” işareti bulunan GET istekleriyle eşleşmiş olmasıdır. POST PUT ve DELETE isteklerinde bu routing çalışmayacaktır. Ayrıca kodda yer alan Bundle ve Controller ismini düzenlemeniz gerekir.