4

コントローラーとビューへのルートが単一のデータベーステーブルを介して制御される、データベース駆動型の MVC スキームを使用する必要があるプロジェクトに取り組んでいます。ただし、現在のバージョンのフレームワークでこれを示すチュートリアルを見つけることができず (それらはすべて、数バージョン前に書かれたようです)、誰かがより新しいバージョンでこのようなことをしたかどうか疑問に思っていましたフレームワークについて、またはこれを簡単な方法で達成する方法について説明しているブログやチュートリアルを誰かが知っている場合。

基本的な考え方は、pageName、controller、module、および view フィールドを含む sitePage テーブルがあるということです。リクエストが処理されたら、指定された pageName についてデータベースにクエリを実行し、適切なコントローラー、モジュール、およびビューを決定し、これを必要な Zend クラスに渡して、リクエストの通常のルーティングと処理を続行する必要があります。

前もって感謝します。

4

3 に答える 3

5

プラグインでrouteStartup()メソッドを使用することもできます。例えば:

 class My_Plugin_PageRoute extends Zend_Controller_Plugin_Abstract {

     public function routeStartup ()  {
         $front = Zend_Controller_Front::getInstance();
                    $pages = new Model_Pages();
                    $page_data = $pages ->getPageInfo();

        $router = $front->getRouter();

        foreach($page_data as $page) {
            $r = new Zend_Controller_Router_Route(
                '' . $page -> page_name,
                array('controller' => 'pages',
                      'action' => 'index',
                      'page_id' => $page -> page_id)
            );
            $router->addRoute('pages_' . $page -> page_id, $r);
        }

     }

 }
于 2011-04-05T07:52:19.077 に答える
2

おそらく最善のアプローチは、ルーターを使用するのではなく、プラグインまたは共通のコントローラーを使用することです。詳細な分析を行わずに、フロントコントローラープラグインを作成することをお勧めします。その後、preDispatch()メソッド内でデータベースと通信してリクエストをリセットし、適切なコントローラーにディスパッチされます。

共通のコントローラーを使用しても同じ効果を得ることができます。すべてのリクエストはそれにルーティングされ、データベースと通信した後、プラグインを使用することを好みますが、適切なコントローラーに転送できます。

マニュアルから:

preDispatch()ディスパッチャによってアクションがディスパッチされる前に呼び出されます。このコールバックにより、プロキシまたはフィルターの動作が可能になります。リクエストを変更し、ディスパッチされたフラグをリセットすることにより(を介してZend_Controller_Request_Abstract::setDispatched(false))、現在のアクションをスキップおよび/または置き換えることができます。

http://framework.zend.com/manual/en/zend.controller.plugins.html

于 2008-12-19T21:43:17.007 に答える
2

より洗練されたアプローチは確かにルーターを使用することですが、そのためには Zend_Controller_Router_Abstract クラスを拡張して "route" メソッドを実装することによりカスタム ルーターを作成する必要があることに気付きました。

"route" メソッドのパラメーターとして Zend_Controller_Request_Abstract オブジェクトを取得します。そこでデータベースと対話してから、次を使用できます。

Zend_Controller_Request_Abstract::setModuleName(),
Zend_Controller_Request_Abstract::setControllerName(),
Zend_Controller_Request_Abstract::setActionName()

ルートを定義します。

それが役立つことを願っています!

于 2008-12-19T21:53:05.087 に答える