2011-10-01 11 views
6

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

私がこれを好きなら、各コントローラはこのルートにマップされます: "polica/ogled/parameter"。

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

これは動作しますが、私はいつも手動routes.phpに情報を入力した:それはOKではありません、これは

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

を自動化されることをどのように私がそうするのですか?

UPDATE:たとえば 、私は名前adsとコントローラを持っています。たとえば、www.example.com/ads/ に行くと、広告が表示されます。 www.example.com/username1に行くと、ユーザusername1によって広告がリストされています。

$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'] = ''; 

よろしく、マリオ

+0

ブリリアント!私はちょうどデフォルトのコントローラでこれを行い、それもそこで動作します。 –

答えて

23

私の現在のroutes.php ...、

userprofilelatestをコントローラもありますあなたのルートの問題は、それを使用することです:実際には、あなたが一致するすべてのルート...ので、あなたはかなりそこにこだわっている。彼らが読み込まれているので

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

すべてのこれらの空路は、ANY前に来なければなりません:あなたは、選択的に再ルーティングすべてのサイトコントローラ、個別に、のようにすることができます)

1: 私はあなたが2つのソリューションを持っているかもしれないと思います彼らが提示された順序、そしてあなたが:最初にそれを置くと、残りのすべてを喜んでスキップします。コメントの後

編集:私は何を意味

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

これはコード冗長性にもかかわらず、私は知っていますが、あなたが言ったように6K未満であることは間違いありません。 URLとウェブアプリケーションの実際の構造はわからないので、それは私にとっては唯一の解決策です。あなたはより詳細な情報を提供する場合、どのようにアプリの定期的なURLが形作られているような、そして、私は私の答え

/エンド・編集

を更新することができ、それが必要になりますので、これは、あまり実用的なソリューションではありませんコードがたくさんありますが、そのようなデザインが欲しいのであれば、それは私の心に来る唯一の方法です。 また、$ルートインデックスとしてregexesを使うことができると考えていますが、あなたのユーザ名がこのように一致する可能性は低いので、ここでは動作しないと思いますが、その可能性を指摘したいだけです。

OR

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

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

のラインに沿って何かこれは非常にきれいな(と意味が生成されます)のURLそれにもかかわらず、他のルートを逃れるためのすべての面倒を避けることができます。

+0

ご返信ありがとうございます。クライアントがドメイン名の後にユーザー名を必要としているので、2番目のソリューションを使用できません。私はあなたの最初の解決策を理解していません。私の場合はそれを私に説明してもらえますか?私の目標は、少ないコードでこの問題を解決することです。今、私は 'routes.php'ファイルに約6000行を持っています。私はこれが好きではありません:/ – Puzo

+0

@Puzo最初の解決策の説明で私の答えを更新しました。そして、はい、6000ルートが間違いなく大きすぎます。 –

+0

私の最初の投稿後の質問を更新しました。もっと情報が必要ですか?どのような種類ですか? – Puzo

1

私はまったく同じ問題を抱えていました。

remapメソッドを持つ "リダイレクト"コントローラを定義します。これにより、処理中の変数文字列を含むcontollerに送られたリクエストを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つのコントローラを介して放置内容に基づいて簡単にそれらをリダイレクトすることができるよどこに定義されているように私はできるだけ多くの変数のユーザーを持つことができる素敵なシステムを作り出すことがわかりました。 http://www.web-and-development.com/codeigniter-minimize-url-and-remove-index-php/ のindex.phpを削除含む/第一URLセグメントを削除/ 2STのURL sigment /ルーティングautomatically.itを削除するあなたのために非常に参考になります。この

+0

うーん..もし私が正しく理解すれば、私は 'routes.php'ファイルにすべてのコントローラを定義し、次に、私はリダイレクトルールを定義するべきですか?これはページのパフォーマンスに影響しますか? – Puzo

+0

@Puzoあなたのコメントを読んで、それは私の答えで言うことを試みたものです。 –

+0

@Chamilyanどのように私は#と/ URLをルーティングで置き換えることができます – Bugfixer

2

ビュー。

1

もう一つの方法は、あなたのintenalコントローラとの配列を宣言し、CodeIgniterのからあなたのroutes.phpファイルで、このようなユーザのコントローラに他のすべてをリダイレクトすることになります。

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