Codeigniterルートに問題があります。私のサイトのすべての登録ユーザーが独自の「ディレクトリ」を取得したいと思います。例:www.example.com/username1
、www.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
ごとに広告が一覧表示されます。コントローラuser
、profile
、latest
、..もあります。
私の現在の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'] = '';
よろしく、マリオ
ルートの問題は、: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が生成され、他のルートをエスケープする煩わしさがなくなります。
これを見る: http://www.web-and-development.com/codeigniter-minimize-url-and-remove-index-php/ これにはindex.phpの削除/最初のURLセグメントの削除/が含まれます2番目のURLsigment/routingを自動的に削除します。これは非常に役立ちます。
私はごく最近、この同じ問題に苦しんでいました。私はこのように私のために働く何かを作成しました:
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システムが生成されることがわかりました。
別の方法は、内部コントローラーで配列を宣言し、codeigniterからroutes.phpファイルで次のように他のすべてをユーザーコントローラーにリダイレクトすることです。
$controllers=array('admin', 'user', 'blog', 'api');
if(array_search($this->uri->segment(1), $controllers)){
$route['.*'] = "polica/ogled/$1";
}