2017-06-22 16 views
0

私は自分のウェブサイト(zendframework 1)にGETパラメータを解析し、そのデータをデータベースから検索してユーザに表示するページを持っています。GETパラメータに基づくzendframeworkルーティング

私は私のURLがそうbasicaly私は、URLにGETパラメータを解析し、データベースから製品の名前を照会するそれを作るために、より多くの人が読める

-> https://example.com/index.php/product/iphone-7s-white 

になりたい

-> my current url : https://example.com/index.php/product/info?id=123 

URLにページ名として表示されます。

私はいくつかのソリューションに出くわしました。それらのうちの1つは、データベース(bootstrap.php)をループし、各製品のルートを追加することで実現しましたが、これは混乱のようですそれ)。

私の問題の解決策はありますか?事前に感謝

+0

あなたの製品テーブルにスラッグを入れて、ルートパラメータに対応するスラッグでラインを取得することができます。あなたはそれを試しましたか? –

+0

私は、get paramsに基づいてブートストラップを行う方法を理解できません。 スラッグは基本的に商品名+日付 –

答えて

0

基本的に、ZF1はURLからの名前のコントローラ/アクションにつながるデフォルトルートを提供します。

あなたはそこに機能を追加することによりapplication/Bootstrap.phpファイルからカスタムルートを追加することができます。

/** 
* This method loads URL routes defined in /application/configs/routes.ini 
* @return Zend_Router 
*/ 
protected function _initRouter() { 
    $this->bootstrap('frontController'); 
    $front = $this->getResource('frontController'); 
    $router = $front->getRouter(); 
    $router->addRoute(
     'user', 
     new Zend_Controller_Router_Route('product/:slug', array(
      'controller' => 'product', 
      'action'  => 'details', 
     ), array(
      'slug' => '[A-Za-z0-9-]+', 
     )) 
    ); 
    return $router; 
} 

そして、ここであなたが行きます!


Chrisが説明したように、要求を処理するためにコントローラコードを変更する必要があります。別の解決策は、余分なアクションを使用することです。 (2つの要求の代わりに、1)

final class ProductController 
{ 
    public function infoAction() 
    { 
     $product = $table->find($this->_param('id')); 
     $this->view->product = $product; 
    } 

    public function detailsAction() 
    { 
     $product = $table->fetch(['slug' => $this->_param('slug')]); 
     $this->forward('info', 'product', [ 
      'id' => $product->id, 
     ]); 
    } 
} 

が、それはあまり効率的であるが、あなたは再利用することができます:

final class ProductController 
{ 
    public function infoAction() 
    { 
     $product = $table->find($this->_param('id')); 
     $this->view->product = $product; 
    } 

    public function detailsAction() 
    { 
     $product = $table->fetch(['slug' => $this->_param('slug')]); 
     $this->view->product = $product; 
     $this->render('info'); 
    } 
} 

さて、あなたはinfoActionの処理の多くを行うと仮定すると、あなたは前進して行くことができますあなたのコード。

+0

ねえ、あなたの答えをありがとう、あなたが投稿したコードを詳述できますか?私は完全にスラグの部分を理解していない、元のURLのidをどのように置き換えることになっていますか? –

+2

アイデアはあなたのDBにスラッグを格納しなければならないということです。スラグはあなたの記事のタイトルであり、それに対して照会できるようにPK(またはユニーク)でなければなりません。このルートはコントローラを起動し、slugパラメータを渡します。次に、slug => $ slugのDBをクエリする必要があります。見つからなければ、404エラーをトリガします。 – Chris

+0

あなたのコメントChrisとして編集されました。私は、スラッグが主キーである必要はないと主張しますが、効率的な検索を行うためには、ユニークでインデックスが必要です。 –

関連する問題