2012-01-20 26 views
7

Zend Framework ile ilgili bazı sorularım var. Tüm statik sayfaları varsayılan varsayılan displayAction() yöntemini kullanarak yönlendirmeyi deniyorum. Amaç, page paramına bakarak isteğin displayAction() işlemine sahip olması, komut sayfasının var olup olmadığını belirlemektir, aksi takdirde görünüm 404 sayfalık bir hata bulamadı. Ek olarak, param ile aynı ada sahip bir yöntemin var olup olmadığını görmek için bir test yapılır, eğer öyleyse, bu eylemi çağırınız. Burada ListelenenGüncelleme: Zend Framework'de statik içeriği yönetmek için en iyi yöntemler?

denetleyici eylemleri application.ini İşte

resources.router.routes.static-pages.route = /:page 
resources.router.routes.static-pages.defaults.module = default 
resources.router.routes.static-pages.defaults.controller = index 
resources.router.routes.static-pages.defaults.action = display 

gelen yönlendirme yapılandırması olduğunu: Artık

public function someAction() { 
    // do something 
} 

public function displayAction() { 
    // extract page param, e.g. 'some'  
    $page = $this->getRequest()->getParam('page'); 

    // create zend styled action method, e.g. 'someAction' 
    $page_action = $page.'Action'; 

    // if a method within this controller exists, call on it 
    if (method_exists($this, $page_action)) { 
     $this->$page_action(); 
    } 

    // if nothing was passed in page param, set to 'home' 
    if (empty($page)) { 
     $page = 'home'; 
    } 

    // if script exists, render, otherwise, throw exception. 
    if (file_exists($this->view->getScriptPath(null)."/".$this->getRequest()->getControllerName()."/$page.".$this->viewSuffix)) { 
     $this->render($page); 
    } else { 
     throw new Zend_Controller_Action_Exception('Page not found', 404); 
    } 
} 

, benim sorular şunlardır: daha iyi bir yolu arasında var mı Bunu yapıyor? Bu çerçeveye nispeten yeniyim, bu yüzden geçerli olan en iyi uygulamalar var mı? Bir denetleyiciden bir eylemi çağırmanın daha iyi bir yolu var mı? Belgelere baktığımda çok fazla şey yaptım, ancak bunun bir kısmı kendini çelişiyor gibi görünüyor.

Güncelleme 1:

bir düşünmek ve bir okuma yaptıktan sonra çözüm basitleştirmek başardı ve bahsedildi birkaç şey dahil ettik. NOT: PagesController'u varsayılan statik içerik denetleyicim olarak kullanıyorum.

Burada listelenen yönlendirme yapılandırması application.ini. "/" Ana sayfasına yapılan çağrılar için "ev" i action param olarak geçiyorum, diğer tüm istekler için, kullanıcı tanımlı/url bağlantı parametresi action içinde gönderilir.

resources.router.routes.home.route = "/" 
resources.router.routes.home.defaults.module = "default" 
resources.router.routes.home.defaults.controller = "pages" 
resources.router.routes.home.defaults.action = "home" 
resources.router.routes.pages.route = "/:action" 
resources.router.routes.pages.defaults.module = "default" 
resources.router.routes.pages.defaults.controller = "pages" 

Denetleyici eylemleri İşte. Eğer kullanıcı parametre tanımlaması bir eylem olarak mevcutsa, çağrılır, aksi takdirde php sihirli işlevi __call'a düşer.

public function someAction() 
{ 
    // Do something 
} 

public function __call($method, $args) 
{ 
    // extract action param, e.g. "home" 
    $page = $title = $this->getRequest()->getParam('action'); 

    // test if script exists 
    if (file_exists($this->view->getScriptPath(null) . "/" 
     . $this->getRequest()->getControllerName() . "/$page . " . $this->viewSuffix)) 
    { 
     // pass title to layout 
     $this->view->assign(compact('title')); 
     // render script 
     $this->render($page); 
    } else { 
     throw new Zend_Controller_Action_Exception('Page not found', 404); 
    } 
} 

Çalışıyor. Yani, işte benim sorularım: Statik içeriği yönetmek için bu yöntemi kullanmakta standartlaştırmayı düşünür müsün? Değilse neden olmasın? Bunu nasıl geliştirirsin? Ayrıca, bu bir GET isteğidir göz önüne alındığında, Zend_Filter_input girişini temizlemek için akıllıca bir hareket mi yoksa sadece aşırı mı?

cevap

1

Yaklaşımınız bana göre makul görünüyor. Ancak, belki de olanak sağlayacak olan yerine __call yöntemin yararlanmalıdır size daha kolay rota senin eylemler ...

Kur böyle rota:

resources.router.routes.static-pages.route = /:action 
resources.router.routes.static-pages.defaults.module = default 
resources.router.routes.static-pages.defaults.controller = index 

Ve böylece gibi Denetleyiciniz:

public function someAction() { 
    //going to URL /some will now go into this method 
} 

public function __call($name, $args) { 
    //all URLs which don't have a matching action method will go to this one 
} 
+0

Geri bildiriminiz için teşekkür ederiz, kesinlikle buna bir göz atacağım. – Hegemon

1

Doğru yolda olduğunu düşünüyorum ancak burada başka fikirler de var. senin INI bölümüne başına yönlendirme

Molası up: Bir blog yönlendirici yani , statik bir sayfa yönlendirici bir forum yönlendirici vb ..

kullanın çeşitli yönlendirici sınıfları işlemek için (Ben zaten böyle yapıyorsun düşünüyorum) Bir kontrolöre göndermek yerine, bölüm başına yönlendirme.

Statik: http://framework.zend.com/manual/en/zend.controller.router.html#zend.controller.router.routes.static

Tümü: http://framework.zend.com/manual/en/zend.controller.router.html

yardımcı olabilecek bazı linkler:

  • codeutopia.net/blog/2007/11/16/routing- ve kompleks-urls-in-zend-çerçeve/
  • www.vayani s.com/2009/03/20/intro-to-zend-framework-routing/
+0

Geri bildiriminiz için teşekkürler, dinamik sayfalar için alternatif statik olmayan yönlendirme yürürlüktedir. Tasarım üzerinde geliştirmek için kullanabileceğim bir şey olup olmadığını görmek için dokümantasyona bir göz atacağım. – Hegemon

İlgili konular