2

私は codeigniter を使用してチュートリアル システムを構築しており、次の URL 構造を実現したいと考えています。

  • /tutorials --> すべてのカテゴリのリストを含む紹介ページ
  • /tutorials/{文字列としてのカテゴリ} --> これにより、指定されたカテゴリのチュートリアルのリストが表示されます (例: /tutorials/php)。
  • /tutorials/{a category as string}/{an ID}/{tutorial slug} --> チュートリアルが表示されます。例: /tutorials/php/123/how-to-use-functions
  • /tutorials/add --> 新しいチュートリアルを追加するページ

問題は、最初の 2 種類の URL を使用する場合、コントローラーのインデックス関数にパラメーターを渡す必要があることです。最初のパラメータはオプションのカテゴリで、2 番目のパラメータはオプションのチュートリアル ID です。投稿する前に調べたところ、 のようなルートを追加できることがわかりましたが、問題は、最後の URL (/tutorials/add) を使用するtutorials/(:any)と、このルートもパラメーターとして渡されることです。add

これを実現する方法はありますか?

4

3 に答える 3

13

ルーティング ルールは次の順序である可能性があります。

$route['tutorials/add'] = "tutorials/add"; //assuming you have an add() method
$route['tutorials/(:any)'] = "tutorials/index"; //this will comply with anything which is not tutorials/add

次に、コントローラーの index() メソッドで、渡されたのがカテゴリ ID なのかチュートリアル ID なのかを判断できるはずです!

于 2012-06-17T21:45:48.343 に答える
10

「追加」だけでなく、コントローラーにさらにメソッドを追加する場合は、リマップが問題にもっと役立つはずだと思います。これで次のタスクが実行されます。

function _remap($method)
{
  if (method_exists($this, $method))
  {
    $this->$method();
  }
  else {
    $this->index($method);
  }
}
于 2012-12-21T10:01:02.850 に答える
3

投稿してから数分後、これに対する可能な解決策を見つけたと思います。(恥ずかしい)。

擬似コード:

public function index($cat = FALSE, $id = FALSE)
{
    if($cat !== FALSE) {
        if($cat === 'add') {
            $this->add();
        } else {
            if($id !== FALSE) {
                // Fetch the tutorial
            } else {
                // Fetch the tutorials for category $cat
            }
        }
    } else {
        // Show the overview
    }
}

このソリューションに対するフィードバックを歓迎します。

于 2012-06-17T21:42:45.443 に答える