假设我有一个名为
的控制器网页
并且有一个方法
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-article
或http://localhost/another-article-blablabla
如何做,不要破坏其他路线,例如$route['friends'] = 'users';
或$route['about-us'] = 'pages/about_us';
?
因为如果我这样做:
$route['(:any)'] = 'pages/slug_on_the_fly/$1';
它可能会破坏其他一切或?
答案 0 :(得分:7)
网址按以下顺序排列:
$route
(routes.php)中的显式路由按顺序检查。[folder/]controller/methodname/args...
作为后备。如果有少量已知的显式路由,您只需将它们添加到$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动态:
$route
文件,其中routes_extra.php
包含在最后。在保存页面或构建/部署站点时,将新路由写入其中。routes.php
并添加新的路由图层。Router.php
挂钩,添加路线。我确信还有其他方法。
答案 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