Bunun anlaşılması için Route::controller metodunun ne iş yaptığına göz atarak başlayabiliriz.
Normalde routes.php dosyasındaki metodların birçoğu route koleksiyonuna rotalar eklenmesi işini yapar. Eklenen bir rota tanımında rotanın istek metodu, rota adı, istek uri'si ve çalıştırılacak metod yer alır. Sonra, Laravel istek yaşam döngüsünde en son işlem(lerden birisi) olarak isteğe karşılık gelen rota çağrılır. artisan routes diye çağırdığımızda dökümü yapılan bu rota koleksiyonunun elemanlarıdır.
controller metodu şöyle çalışır. İkinci parametrede yer alan Controller sınıfı gözden geçirilir. İçerisinde get, post, put, delete vb kelimelerle başlayan metod isimleri bulunur. Sonra bu snake_case'e çevrilir. Dolayısıyla "postGetir" diye bir metod varsa bu "post_getir" olur. Sonra bu "_" ile bölünür. İlk kısmı HTTP metod olarak, gerikalanı ise "_" lar "-"ye çevrilerek ön uri kısmını oluşturur. Uri kısmının tamamı ise controller metodu tanımında verilen ilk parametreye "/" ile birlikte eklenir. Son olarak Controller sınıfındaki metodların parametreleri olabileceği dikkate alınarak /{one?}/{two?}/{three?}/{four?}/{five?} eklenir (bunların hepsinin isteğe bağlı olduğuna dikkat edelim) ve böylece oluşturulan rota rota koleksiyonuna eklenir.
Dolayısıyla Route::controller('aka', 'TakaController') demişsek ve TakaController sınıfında postGetir adında bir metod varsa rota koleksiyonuna
GET|HEAD aka/getir/{one?}/{two?}/{three?}/{four?}/{five?} | TakaController@getGetir
eklenir (4.1 sürümünde get çağrılarında aynı zamanda head'de oluşturulur.)
Buraya kadar zaten bildik şeyler. Ancak getIndex özel bir metod olarak ele alınır ve Controller'in sanki varsayılan metodu gibi kullanılır. Bunu sağlamak için yukarıdaki bahsedilen dünüştürmelerden sonra eğer (henüz --one/two... kısmı eklenmeden önce) "aka/index" (örneğimizde ilk parametre "aka" olduğu için) mi diye kontrol yapılır, eğer böyleyse diğer metodları için yapılanın aynısı yapılmakla kalmaz aynı zamanda sadece "aka" için de bir get rotası TakaController@getGetir'e bağlanır. Bu yüzden m.erin'in verdiği örnekte getIndex metodu için iki rota eklenmiş olur (olağan durumda).
Birincisi GET|HEAD test/index/{one?}/{two?}/{three?}/{four?}/{five?} | TestController@getIndex
İkincisi GET|HEAD test | TestController@getIndex
Şimdi @m.erin'in sorununa gelince, bu ikinci rotanın eklenmediğini, ama ilkinin de "index" yerine "Index" olarak eklendiğini görüyoruz.
snake_case dönüştürmesi şöyle yapıldığına göre,
return strtolower(preg_replace('/(.)([A-Z])/', '$1'.'_'.'$2', 'getIndex'));
// normalde 'get_index' sonucu vermesi lazım.
Demek ki @m.erin'in bilgisayarında strtolower fonksiyonu "I" harfini "i" harfine dönüştüremiyor ve sonuç "get_Index" oluyor. Dolayısıyla "test\Index" olarak uri oluşuyor. "test\Index" == "test\index" sınaması doğru olmadığından bunu diğer metodlar için olan gibi "GET|HEAD test/Index/{one?}/{two?..." rotası olarak ekliyor ama index metodu için gerekli "GET|HEAD test" metodunu ekleyemiyor. Strtolower fonksiyonunun İ, Ş, Ü vs küçük harfe çevirmediğini biliyorduk ama I harfini çevirmeyen bir dil ayarı ile karşılaşmış oluyoruz.