1

入れ子になったカテゴリをサポートする CakePHP アプリケーションに設定されたカテゴリ構造があります。つまり、カテゴリは子および/または親を持つことができます。categoriesテーブルのデータベース列は、、、、、、idです。parent_idlftrghtnameslug

カテゴリとそれらのカテゴリに関連する投稿のすべての CRUD ロジックを既に作成しました。

例として、 というカテゴリaboutと というサブカテゴリがあるとしますmemysite.com/about/meカテゴリに関連するすべての投稿を表示するURL を希望しmeます。

このリクエストをルーティングする方法がわかりません。私がRouter::connect('/:category', array('controller' => 'categories', 'action' => 'view'))それを行うだけでは、 でしか機能しません。また、スケーラビリティがmysite.com/aboutまったくないため、できません。/:category/:category/:category

ネストされたカテゴリのルーティングを実現するにはどうすればよいですか?

4

1 に答える 1

2

* ルートには演算子を使用できます。

ルートにサブカテゴリが 1 つしかないことがわかっている場合、ルートは次のようになります。

Router::connect('/:category/*', 
                 array('controller' => 'categories', 'action' => 'view'))

それは一致mysite.com/about/meし、このようなアクションに渡します

CategoriesController->view('me')

meパラメータとして渡され、そのアクション内ですべてのクエリなどを実行できます。

ただし、カテゴリのネストの長さが定義できない場合は、アプローチが異なります。のような URL もマッピングしたいとしますmysite.com/about/me/2012/march。次に、ルート ルールは次のようになります。

Router::connect('/:category/**', 
                 array('controller' => 'categories', 'action' => 'view'))

そのダブル**は、ドキュメントでは次のように呼ばれています

末尾に二重スターを使用すると、URL の残りの部分が単一の渡された引数として取り込まれます。これは、/ を含む引数を使用する場合に便利です。

そのため、カテゴリの後のすべてがパラメーターとして渡されます。この例では、呼び出します

CategoriesController->view('me/2012/march')

そのアクションでは、パラメーターの解析を実行して、必要なネストを取得する必要があります。コントローラーで保護された関数またはプライベート関数としてその関数を抽出することをお勧めします

class Categories as AppController {
    public function view($url_params) {
        //it could be a string or an array or etc, depends on how you want to handle it
        $array = $this->_parseCategories($url_params);
    }

    protected function _parseCategories($stringUrl) {
        $subcategories = explode('/', $stringUrl);
        //add whatever else you want to do
        return $subcategories;
    }
}

必要に応じてルートを調整し ( の受け渡しは含めませんでした:category)、コントローラーも少し変更する必要がありますが、十分にスケーラブルである必要があります。

于 2013-07-02T20:32:29.617 に答える