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

Der*_*der 5 php codeigniter url-rewriting url-routing

假设我有一个名为的控制器

网页

并且有一种方法

slug_on_the_fly

public function slug_on_the_fly($slug)

我的路线怎么样?

例如,对于博客控制器,它很容易:

$route['blog/(:any)'] = 'pages/slug_on_the_fly/$1';
Run Code Online (Sandbox Code Playgroud)

然后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';

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

Fra*_*ila 7

网址按以下顺序排列:

  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'
Run Code Online (Sandbox Code Playgroud)

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

(!可能不是一个好主意,顺便说一句)如果您有大量这样的路线,你可以只添加通配符路线终点$route:

$route['([^/]+)/?'] = 'pages/slug_on_the_fly/$1'
Run Code Online (Sandbox Code Playgroud)

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

但是,您放弃了一些隐式路由的可能性,因为Codeigniter没有为控制器提供任何方式"放弃"路由回路由器.例如,如果您有一个名为"foo"的控制器并且您想要一个类似于/foo路由的URL Foo::index(),则必须为此案例添加一个显式路由,因为它将被此路由捕获并发送给它Pages::slug_on_the_fly('foo').一般来说,你不应该有slugs也是控制器类名!这就是为什么你应该拥有极少数这些url-slugs,如果你有任何!

如果您同时拥有大量这些显式路由并且您不愿意遵守这些隐式路由限制,则可以尝试$route动态添加它们:

  1. 制作一个包含在最后的routes_extra.php文件routes.php.在保存页面或构建/部署站点时,将新路由写入其中.
  2. 子类Router.php并添加新的路由图层.
  3. 添加一个pre_system添加路由的钩子.

我相信还有其他方法.


Roo*_*eyl 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;
Run Code Online (Sandbox Code Playgroud)

将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;
}
Run Code Online (Sandbox Code Playgroud)

您所要做的就是在创建博客条目时创建记录并完成:

INSERT INTO `blog_slugs` (`slug`) VALUES ('name-of-the-article');
Run Code Online (Sandbox Code Playgroud)