Zend Framework 1 – Router

Merhabalar bu makalede Zend Router’ı anlatmaya çalışacağım 🙂

$router->addRoute(
    'aliaysahobaa',
    new Zend_Controller_Router_Route('user/:username',
                                     array('controller' => 'user',
                                           'action' => 'show'))
);

Zend Framework’de url yapısını ilgili dosyaya aktaran componentin adı “router” dır, Zend_Controller içerisinde yer alır bknz. www.localhost.com/:controller/:action . Belirli, özel url yapısı oluşturmak oldukça kolay. Zend’in kendi sitesinden ilgili dökümana uluşabilirsiniz;

Bootstrap.php’de methodumuzu oluşturuyoruz;

protected function _initRoute(){
  $frontController = Zend_Controller_Front::getInstance();
   $router = $frontController->getRouter();   

}

İşte bu kadar sınıfımızı örnekledik, metodumuzu çağırdık SEO dostu url yapısı oluşturmaya başlayabiliriz. UserController’imiz olsun, kullanıcı bilgilerinin görüntüleneceği bir sayfamız olması içinde showAction metodumuz olsun. Normalde url yapımızı şu şekilde oluşturuyorduk; www.localhost.com/user/show/uye/johntravolta.

Url yapısını www.localhost.com/user/johntravolta şeklinde göstermek için ;

$router->addRoute(
    'user',
    new Zend_Controller_Router_Route('user/:username',
                                     array('controller' => 'user',
                                           'action' => 'show'))
);

Burada dikkat etmeniz gereken nokta $router->addRoute’de ilk parametrede tanımladığımız user router’ı, oluşturacağımız diğer routerlarıda da varsayarsak benzersiz yani uniq olmak zorunda ve routerın ismi controller ile aynı olmak zorunda değil isterseniz aliayse olarak belirleyin hiç farketmez, yani bu şekilde de yapabilirsiniz;

$router->addRoute(
    'aliaysahobaa',
    new Zend_Controller_Router_Route('user/:username',
                                     array('controller' => 'user',
                                           'action' => 'show'))
);

showAction içerisinde kullanıcının adını $this->getRequest()->getParam(‘username’); ile elde ediyoruz. Router’de :id olarak belirleseydik getParam(‘id’); olarak parametreyi elde edecektik.

Zend Route Regular Expression

Zend Framework’de daha spesifik url yapısı oluşturabilmek içinse regEx kullanacağız. Url yapımız http://localhost.com/blog/archive/01-Zend-framework-disable-render.html olsun, routerımızda şu şekilde olacak;

$route = new Zend_Controller_Router_Route_Regex(
    'blog/archive/(\d+)-(.+)\.html',
    array(
        'controller' => 'blog',
        'action'     => 'view'
    ),
    array(
        1 => 'id',
        2 => 'description'
    ),
    'blog/archive/%d-%s.html'
);
$router->addRoute('blogArchive', $route);

www.localhost.com/3939-some-title-here şeklinde bir url yapısı elde etmek içinse

$route = new Zend_Controller_Router_Route_Regex('(\d+)-?(.*)',
                       array('controller' => 'blog', 'action' => 'article'),
                       array(1 => 'id')); 
$ctrl->addRoute('blogArticle', $route);

Elimden geldiğince anlatmaya çalıştım bu makalede buraya kadar 🙂 Görüşmek üzere CYA !

Not : Zend Router kullandığınız yapıda Zend_Paginate ile sayfalama yaptığınızda sıkıntı çıkarmaktadır ( bknz. $this->url() ). Zend içerisinde bazı Çözümler denediysem’de başarılı olamadım. Kendi çözümüm ise birazcık işin kolay tarafına kaçmak (bknz. request_uri) 🙂

* Edit : 5 Aralık itibari Zend Router ile Zend Paginate kütüphanesini kullandığım sayfada yaşadığım url problemini tam olarak çözdüm 🙂