5

私がという名前のコントローラーを持っているとしましょう

ページ

そして方法があります

slug_on_the_fly

public function slug_on_the_fly($slug)

このための私のルートはどのようになりますか?

たとえば、ブログコントローラーの場合は簡単です。

$route['blog/(:any)'] = 'pages/slug_on_the_fly/$1';

その後、http://localhost/blog/name-of-the-articleうまく機能します

blogしかし、私がそうせずにそれをやりたい場合はどうなりますか?

http://localhost/name-of-the-articleまたhttp://localhost/another-article-blablabla

それを行う方法と別のルートを壊さないでください例えば$route['friends'] = 'users';または$route['about-us'] = 'pages/about_us';

私がそうするなら: $route['(:any)'] = 'pages/slug_on_the_fly/$1';

それはおそらく他のすべてを台無しにするでしょうまたは?

4

6 に答える 6

8

URLは次の順序でルーティングされます。

  1. $route(routes.php)の明示的なルートが順番にチェックされます。
  2. フォールバックとして暗黙のルート[folder/]controller/methodname/args...が試行されます。

既知の明示的なルートが少数ある場合は、それらを次の場所に追加できます$route

$route['(my-slug|my-other-slug|my-third-slug)'] = 'pages/slug_on_the_fly/$1'

(ルートキーは、実際にはとで正規表現として解析され、:any:numに書き換えられ.+ます[0-9]+。)

そのようなルートが多数ある場合(おそらく良い考えではありませんが、ところで!)、ワイルドカードルートを最後に追加することができます$route

$route['([^/]+)/?'] = 'pages/slug_on_the_fly/$1'

ここでの正規表現は、「スラッシュのないURL(おそらく最後を除く)」を意味します。他に制限がある場合は、これを改良してスラッグ形式を説明できます。(良いものは[a-z0-9-]+です。)コントローラーがデータベース内のスラッグを見つけたら、完了です。そうでない場合は、404を提供する必要があります。

ただし、Codeigniterはコントローラーがルーターに戻るルートを「あきらめる」方法を提供しないため、暗黙的なルーティングの可能性をあきらめます。たとえば、「foo」という名前のコントローラーがあり、にルーティングするようなURL/fooが必要な場合は、このルートによってキャッチされて代わりにFoo::index()送信されるため、この場合の明示的なルートを追加する必要があります。一般に、コントローラークラス名でもあるスラッグは使用しないでください。これが、もしあれば、これらのurl-slugの数を非常に少なくする必要がある理由です!Pages::slug_on_the_fly('foo')

これらの明示的なルートが多数あり、これらの暗黙的なルーティングの制限を順守したくない場合は、それらを動的に追加してみてください$route

  1. 最後routes_extra.phpにを含むファイルを作成しますroutes.php。ページの保存の一部として、またはサイトを構築/展開するときに、新しいルートを書き込みます。
  2. サブクラスRouter.php化して、新しいルーティングレイヤーを追加します。
  3. ルートを追加するpre_systemフックを追加します。

他にも方法があると思います。

于 2013-03-12T19:48:28.273 に答える
6

データベース駆動型ルートを使用できます。

blog_slugsテーブルをMySQLデータベースに追加します。

CREATE TABLE IF NOT EXISTS `blog_slugs` (
  `id` bigint(20) NOT NULL auto_increment,
  `slug` varchar(192) collate utf8_unicode_ci NOT NULL
  PRIMARY KEY  (`id`),
  KEY `slug` (`slug`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;

application / config/routes.phpのコードを次のコードに置き換えます。

$route[ 'default_controller' ]  = 'main';
$route[ '404_override' ]        = 'error404';

require_once( BASEPATH .'database/DB'. EXT );
$db =& DB();
$query = $db->get( 'blog_slugs' );
$result = $query->result();
foreach( $result as $row )
{
    $route[ $row->slug ] = 'pages/slug_on_the_fly/$1;
}

その場合、ブログエントリを作成するときにレコードを作成するだけで、次のことが完了します。

INSERT INTO `blog_slugs` (`slug`) VALUES ('name-of-the-article');
于 2013-03-12T18:45:48.613 に答える
3

404オーバーライド予約ルートコントローラー/メソッドを使用します。有効なコントローラー/ルートが存在しない場合、このメソッドが呼び出されます。キャッチオールとして最適です。

于 2013-03-13T06:30:47.973 に答える
0

ページコントローラー以外に、コントローラー1、コントローラー2、コントローラー3などの3つのコントローラーがあるとします。

$route['^(?!controller1|controller2|controller3).*'] = 'pages/slug_on_the_fly/$1';;
于 2013-03-12T17:12:18.657 に答える
0

多分これはあなたを助けるでしょう。

$route['controllerName/([^/]+)/([^/]+)'] = "index/author/$1/$2";
于 2018-03-01T09:24:20.617 に答える
0

これはあなたを助けることができます

$route['controllerName/(:any)] = "controllename/method/slug";

于 2020-01-30T15:39:22.810 に答える