如何设置CI中使用塞动态路由?(How to set dynamic route to use sl

2019-07-21 10:30发布

比方说,我有一个控制器命名

网页

并有一个方法

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-articlehttp://localhost/another-article-blablabla

如何做到这一点,不要打破了另一个途径如$route['friends'] = 'users';$route['about-us'] = 'pages/about_us';

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

它可能会毁掉一切还是?

Answer 1:

网址是路由的顺序如下:

  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-]+ )。如果您的控制器发现在DB的蛞蝓,你就大功告成了。 如果不是这样,它必须服务于404。

但是,你放弃了一些隐含的路由作为笨不提供任何形式的控制器“放弃”的路线回到路由器的可能性。 举例来说,如果你有一个名为“富”控制器,并且希望像一个URL /foo路由到Foo::index()您必须对这种情况下添加一个明确的路线,因为它会通过这条路线被捕获并送到Pages::slug_on_the_fly('foo')来代替。 在一般情况下,你不应该有蛞蝓这也是控制器类的名字! 这就是为什么你应该有一个非常小的数目,这些网址,蛞蝓,如果您有任何可言!

如果你同时拥有大量的这些明确的路线你是不是愿意这些隐路由限制里面,你可以尝试把它们添加到$route动态:

  1. 做一个routes_extra.php文件,该文件routes.php包括在末端。 写新航线,以它作为保存页面,或当你构建/部署站点的一部分。
  2. 子类Router.php并添加新的路由层。
  3. 添加pre_system挂钩,增加了航线。

我敢肯定还有其他的方法。



Answer 2:

你可以使用数据库驱动的路线。

表中添加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;

替换在与下面的一个应用程序/配置/ 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');


Answer 3:

使用404覆盖保留路由控制器/方法。 如果有效的控制器/路由不存在,这个方法会被调用。 作为一个包罗万象的伟大工程。



Answer 4:

让我们假设你有3个控制器以外的其他页面控制器说控制器1,控制器2和controller3然后,

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


Answer 5:

也许这会帮助你。

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


文章来源: How to set dynamic route to use slug in CodeIgniter?