2012-01-20 15 views
7

Zend Frameworkに関するいくつかの質問があります。私は現在デフォルトのdisplayAction()メソッドを使用してデフォルトのコントローラにすべての静的ページをルーティングしようとしています。その目的は、page paramを見て、スクリプトページが存在するかどうかを判断し、そうでなければ404ページが見つかりませんエラーを表示して、ビューをレンダリングするかどうかを決定することです。さらに、paramと同じ名前のメソッドが存在するかどうかを調べるテストが行​​われます。存在する場合は、そのアクションを呼び出します。ここに記載されているUpdated:Zend Frameworkの静的コンテンツを管理するためのベストプラクティス?

ここのapplication.ini

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 

からのルーティング設定は、コントローラのアクションです:

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); 
    } 
} 

、ここに私の質問は以下のとおりです。のより良い方法はありますこれをする?私はこのフレームワークには比較的新しいので、適用されるベストプラクティスはありますか?コントローラ内からアクションを呼び出すより良い方法はありますか?私はドキュメンテーションを通して多くのことを見てきましたが、それのかなりの部分はそれ自身と矛盾しているようです。

アップデート1:

考え、読み取りを持った後、私は解決策を簡素化するために管理し、記載されたいくつかのことを含めました。注:私はPagesControllerをデフォルトの静的コンテンツコントローラとして使用します。

ここでは、application.iniのルーティング設定を示します。ホームページへの呼び出し、つまり「/」は、actionパラメータとして「home」を渡し、他のすべてのリクエストについては、ユーザ定義/ URLリンクパラメータはactionで送信されます。

ここではコントローラの動作を示します。ユーザー定義のパラメータがアクションとして存在する場合は、それが呼び出されます。それ以外の場合は、PHPの魔法の関数__callに渡されます。

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); 
    } 
} 

これは機能します。そこで、私の質問は次のとおりです。このメソッドを静的コンテンツの管理に使用することを標準化することを検討しますか?そうでない場合は、どうしてですか?どのように改善しますか?また、これはGETリクエストであると考えて、Zend_Filter_inputを使用して入力を浄化するのは賢明ですか?

答えて

1

あなたのアプローチは私にとっては妥当と思われます。

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

そしてそうのようなあなたのコントローラ:

しかし、おそらくあなたは、ルートあなたの行動...

セットアップこのようなあなたのルートより簡単にできるように思われる、代わりに__call方法の利点を取る必要があります

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

フィードバックいただきありがとうございます、私は間違いなくこれを見ていきます。 – Hegemon

1

ここで正しいトラックには、いくつかの他のアイデアがあります。あなたのINIのセクションごとに、あなたのルーティング

ブレークアップ:ブログのルータすなわち 、静的なページのルータフォーラムルータなど。

使用するさまざまなルータクラスを処理するために、(私はすでにこれをやっていると思います)コントローラに送信するのではなく、セクションごとにルーティングします。

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

すべて: http://framework.zend.com/manual/en/zend.controller.router.html

助けるかもしれないいくつかのリンク:

  • codeutopia.net/blog/2007/11/16/routing-を複雑なURLの枠組み/
  • www.vayani s.com/2009/03/20/intro-to-zend-framework-routing/
+0

フィードバックをいただきありがとうございます。あなたが言うように、ダイナミックページでは代わりの非静的ルーティングが用意されています。ドキュメントを見て、デザインを改善するために使用できるものがあるかどうかを確認します。 – Hegemon