如何在CodeIgniter中设置动态路由以使用slug?

时间:2013-03-12 16:47:27

标签: php codeigniter url-rewriting url-routing

假设我有一个名为

的控制器

网页

并且有一个方法

slug_on_the_fly

public function slug_on_the_fly($slug)

我的路线怎么样?

E.g。对于博客控制器来说很简单:

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

然后http://localhost/blog/name-of-the-article效果很好

但是,如果我想这样做就像没有blog那样,例如。

http://localhost/name-of-the-articlehttp://localhost/another-article-blablabla

如何做,不要破坏其他路线,例如$route['friends'] = 'users';$route['about-us'] = 'pages/about_us';

因为如果我这样做: $route['(:any)'] = 'pages/slug_on_the_fly/$1';

它可能会破坏其他一切或?

6 个答案:

答案 0 :(得分:7)

网址按以下顺序排列:

  1. $route(routes.php)中的显式路由按顺序检查
  2. 尝试隐式路由[folder/]controller/methodname/args...作为后备。
  3. 如果有少量已知的显式路由,您只需将它们添加到$route

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

    (路由键实际上被解析为具有:any的正则表达式,而:num被重写为.+[0-9]+。)

    如果您有大量此类路线(可能不是一个好主意,BTW!),您只需添加通配符路线到$route结束

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

    这里的正则表达式意味着“任何没有斜线的网址(除了可能是最后一个)”。如果您有任何其他限制,可以对其进行优化以描述您的slug格式。 (一个好的是[a-z0-9-]+。)如果你的控制器在数据库中找到了slug,你就完成了。如果没有,则必须提供404。

    但是,您放弃了一些隐式路由的可能性,因为Codeigniter没有为控制器提供任何方式“放弃”路由回路由器。例如,如果你有一个名为'foo'的控制器并且你想要一个像/foo这样的网址路由到Foo::index(),你必须为这种情况添加一个显式路由,因为它会被这条路由捕获并且已发送至Pages::slug_on_the_fly('foo')一般情况下,你不应该有一些也是控制器类名称的slug!这就是为什么你应该拥有这些url-slugs的数量非常少,如果你有的话呢!

    如果您两者大量这些显式路由,您不愿意遵守这些隐式路由限制,您可以尝试将它们添加到{{1动态:

    1. 制作一个$route文件,其中routes_extra.php包含在最后。在保存页面或构建/部署站点时,将新路由写入其中。
    2. 子类routes.php并添加新的路由图层。
    3. 添加Router.php挂钩,添加路线。
    4. 我确信还有其他方法。

答案 1 :(得分: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');

答案 2 :(得分:3)

使用404 override reserved route控制器/方法。如果不存在有效的控制器/路由,则将调用此方法。非常适合作为一个包罗万象的人。

答案 3 :(得分:1)

假设你有3个控制器而不是页面控制器说控制器1,控制器2和控制器3然后,

$route['^(?!controller1|controller2|controller3).*'] = 'pages/slug_on_the_fly/$1';;

答案 4 :(得分:0)

也许这会对你有帮助。

$route['controllerName/([^/]+)/([^/]+)'] = "index/author/$1/$2";

答案 5 :(得分:0)

这可以帮助您

.gz