web-dev-qa-db-ja.com

Codeigniterのルート-自動的に

Codeigniterルートに問題があります。私のサイトのすべての登録ユーザーが独自の「ディレクトリ」を取得したいと思います。例:www.example.com/username1www.example.com/username2。この「ディレクトリ」は、コントローラ「polica」、メソッド「ogled」、パラメータ「username1」にマップする必要があります。

これが好きな場合は、各コントローラーが「polica/ogled/parameter」というルートにマップされます。それはOKではありません:

$route["(:any)"] = "polica/ogled/$1";

これは機能しますが、私は常にroutes.phpに手動で情報を入力しました。

$route["username1"] = "polica/ogled/username1";

これを自動化するにはどうすればよいですか?

PDATE:たとえば、adsという名前のコントローラーがあります。たとえば、www.example.com/ads/に移動すると、広告が一覧表示されます。 www.example.com/username1にアクセスすると、ユーザーusername1ごとに広告が一覧表示されます。コントローラuserprofilelatest、..もあります。

私の現在のroutes.php

$route['oglasi'] = 'oglasi';
$route['(:any)'] = "polica/ogled/$1"
$route['default_controller'] = 'domov';
$route['404_override'] = '';

私はこのコードの問題を解決しました:

$route['oglasi/(:any)'] = 'oglasi/$1';
$route['(:any)'] = "polica/ogled/$1"
$route['default_controller'] = 'domov';
$route['404_override'] = '';

よろしく、マリオ

7
Puzo

ルートの問題は、:anyを使用することで、実際には... Anyルートであるため、ほとんど行き詰まっていることです。私はあなたが2つの解決策を持っているかもしれないと思います:

1)次のように、すべてのサイトコントローラーを個別に選択的に再ルーティングできます。

$route['aboutus'] = "aboutus";
$route['where-we-are'] = "whereweare";
//And do this for all your site's controllers
//Finally:
$route['(:any)'] = "polica/ogled/$1";

これらのルートはすべて、提示された順序で読み取られるため、ANYの前に来る必要があります。最初に:anyを配置すると、残りのすべてがスキップされます。

コメント後の編集:

つまり、任意のセグメントと照合する場合、ルーターは常にユーザーを使用して再ルーティングするため、コントローラー(デフォルトでは最初のURIセグメント)をまったく使用できないことを意味します。定義された法則。 CIが他のコントローラーを実行できるようにするには(それらが何であれ、私はいくつかの一般的なWebページを使用しましたが、文字通りすべてである可能性があります)、再ルーティングからそれらを除外して許可する必要があります。そして、ANYルールの前に配置することでこれを実現できます。これにより、CIがルーティングルールを通過するたびに、最初に「エスケープ」したルールが解析され、URLで見つかったものと一致しない場合にのみ渡されます。 :ANYルールに。

それでも、これはコードの冗長性であることは知っていますが、あなたが言ったように、それらは確かに6K未満になります。あなたのURLとあなたのウェブアプリケーションの実際の構造がわからないので、それが私の頭に浮かぶ唯一の解決策です。アプリの通常のURLがどのように形成されるかなど、さらに情報を提供していただければ、回答を更新できます。

/編集終了

これは多くのコードを必要とするため、あまり実用的な解決策ではありませんが、そのようなデザインが必要な場合は、それが私の頭に浮かぶ唯一の方法です。また、正規表現を$ routeインデックスとして使用できると考えてください。ただし、ユーザー名がこのように一致する可能性は低いため、ここでは機能しないと思いますが、その可能性を指摘したいと思います。

[〜#〜]または[〜#〜]

2)デザインパターンを少し変更し、ユーザー名に別のルートを割り当てることができます。

$route['user/(:any)'] = "polica/ogled/$1";

これにより、非常にきれいな(そしてセマ​​ンティックな)URLが生成され、他のルートをエスケープする煩わしさがなくなります。

26
Damien Pirsy

これを見る: http://www.web-and-development.com/codeigniter-minimize-url-and-remove-index-php/ これにはindex.phpの削除/最初のURLセグメントの削除/が含まれます2番目のURLsigment/routingを自動的に削除します。これは非常に役立ちます。

2
jiabo.zhang

私はごく最近、この同じ問題に苦しんでいました。私はこのように私のために働く何かを作成しました:

remap メソッドを使用して「リダイレクト」コントローラーを定義します。これにより、進行中の変数文字列とともにコントローラーに送信された要求を1つの関数に集めることができます。したがって、http://yoursite/jeff/またはhttp://yoursite/jamieにリクエストが行われた場合、それらのメソッドはヒットせず、代わりにhttp://yoursite/リマップ関数がヒットします。 (それらのメソッド/名前が存在しない場合でも、インデックス関数がある場合でも、それはそれに取って代わります)。 _Remapメソッドでは、条件付きスイッチを定義できます。条件付きスイッチは、コードの残りの部分と連携して、ユーザーを任意の方法でリダイレクトします。

次に、このリダイレクトコントローラをデフォルトのコントローラとして定義し、次のようにルートを設定する必要があります。

$route['(.*)'] = "redirect/index/$1";
$route['default_controller'] = "redirect";

これは、基本的にすべてが何であれ、最終的にはこの_remapスイッチを介してこのコントローラーにリダイレクトされるため、最初は少し問題になります。

しかし、あなたができることは、これらのルートステートメントの上に、この条件を順守したくないルール/ルートを定義することです。

つまり、

$route['myroute'] = "myroute";
$route['(.*)'] = "redirect/index/$1";
$route['default_controller'] = "redirect";

これにより、定義されている数の可変ユーザーを持つことができ、1つのコントローラーを介してそれらが表すものに基づいて簡単にリダイレクトできるNiceシステムが生成されることがわかりました。

1
Chamilyan

別の方法は、内部コントローラーで配列を宣言し、codeigniterからroutes.phpファイルで次のように他のすべてをユーザーコントローラーにリダイレクトすることです。

$controllers=array('admin', 'user', 'blog', 'api');
if(array_search($this->uri->segment(1), $controllers)){
    $route['.*'] = "polica/ogled/$1";
}
1
alex iancu