11 Haziran 2014

Zend Framework’de Veritabanı ile Routing

ile hasan

Zend’de routing listenizi -en azından bir kısmını- veritabanında tutmak istiyorsanız Bootstrap’da bu işi yapamıyorsunuz. Çünkü henüz bootstrap aşamasında veritabanına bağlanamıyorsunuz. Google’da aradım taradım, bazı öneriler gördüm ama çözemedim.

Routing işine girmeden önce, artık kullanılmayan URL’ler için ErrorController’da db taraması yapıp doğru linke 301 (Permanently Moved) hatası ile yönlendiriyordum.

$this->_helper->redirector->setCode(301);
$this->_redirect($yenilink);

Burada yönderme yapılıyor. Yani kullanıcı açısından tarayıcının url’i değişiyor. Ziyaretçi artık kullanmadığınız mesela http://falanca.com/filanca adresine girmek isterken siz onu http://falanca.com/yeniadres gibi bir adrese yönlendirmiş oluyorsunuz.Bu sırada 301 hatası verdiğiniz için aynı linke arama motorları da erişmek istediğinde 301 hatasını dikkate alıp arama sonuçlarını güncelleyebiliyorlar. O nedenle 301 önemli.

Routing’de ise işler daha farklı. Kullanıcının url olarak http://falanca.com/afilli-url gibi bir adresi tıklamasını istityorsunuz. Normalde böyle bir controller/action kümesi yok. O nedenle ErrorController’daki ErrorAction çalışacak, siz orada ‘EXCEPTION_NO_ACTION’ ile hatanın tipini yakaladıktan sonra taklanızı atıp bu adamın hangi controller/action’ı çağırmak istediğini afilli routing tablonuzdan kontrol edip o action’u çalıştıracaksınız. Kullanıcı bu transparan olayı farketmeyecek. Çünkü url değişmemiş olacak.

İşte bunun için yine ErrorController’da şu satırları kullanmak yeterli:

$request=$this->getRequest();
$request->setControllerName('hedefcontroller');
$request->setActionName('hedefaction');
$request->setParam('id',$id]);
$request->setDispatched(false);