【问题标题】:CodeIgniter custom universal Router classCodeIgniter 自定义通用路由器类
【发布时间】:2014-04-30 11:15:00
【问题描述】:

我正在尝试“缩短”我的网址,例如来自:

http://mydomain.com/controller/method/something-here

进入

http://mydomain.com/something-here

通过添加到routes.php:

$route['(.*)'] = 'router/resolve/$1';

并创建一个Router 类,其resolve() 方法确定something-here 是否与我的一个数据库表(实体)中的一行匹配。如果是这样,我想通过调用适当的控制器::方法来加载条目。

例如,如果something-herebook 的类型,我希望Router::resolve() 调用Book::view($id)

但是,我意识到控制器不可能调用另一个控制器的方法。 (是吗?)

我也不能使用redirect("book/view/$id"),因为$route['(.*)'] 会在book(第一段)上调用Router::resolve()

关于如何实现我的目标有什么建议吗?

【问题讨论】:

标签: php codeigniter routing routes


【解决方案1】:

我能想到两种解决方案;
1) 使用HMVC architecture,这将允许从另一个控制器调用一个控制器。

2) 动态生成您的路线。
这可能不是最有效或最优雅的解决方案,但它是一种选择。

<?php
$route[ 'default_controller' ]  = 'main';
$route[ '404_override' ]        = 'error404';

require_once( BASEPATH .'database/DB'. EXT );
$db =& DB();
$query = $db->get( 'whatever_table' );
$result = $query->result();
foreach( $result as $row )
{
    $route[$row->slug.'/(:any)'] = $row->controller.'/'.$row->method.'/$1';
}

正如之前向我指出的那样,路线是使用正则表达式(_parse_routes)处理的,因此这可能不是最快的性能,这取决于您将生成多少路线以及您的感受性能影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    相关资源
    最近更新 更多