繁体   English   中英

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

[英]How to set dynamic route to use slug in CodeIgniter?

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

并且有一个方法

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

它可能会破坏其他一切还是?

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

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

这里的正则表达式的意思是“任何没有斜杠的网址(也许最后一个除外)”。 如果您有任何其他限制,您可以改进它以描述您的 slug 格式。 (一个好的是[a-z0-9-]+ 。)如果您的控制器在 db 中找到了 slug,那么您就完成了。 如果没有,它必须提供 404。

但是,您放弃了某些隐式路由的可能性,因为 Codeigniter 没有提供任何方式让控制器“放弃”返回路由器的路由。 例如,如果您有一个名为 'foo' 的控制器,并且您希望像/foo这样的 url 路由到Foo::index() ,则必须为这种情况添加显式路由,因为它会被该路由捕获并发送到Pages::slug_on_the_fly('foo')代替。 一般来说,你不应该有也是控制器类名的 slug! 这就是为什么你应该拥有很少数量的这些 url-slugs,如果你有的话!

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

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

我确定还有其他方法。

您可以使用数据库驱动的路由。

将表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');

使用404 覆盖保留的路由控制器/方法。 如果不存在有效的控制器/路由,则将调用此方法。 作为一个包罗万象的工作非常好。

假设您有 3 个控制器,而不是页面控制器,例如 controller1、controller2 和 controller3,然后,

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

也许这会帮助你。

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

这可以帮助你

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM