由于 CodeIgniter 开箱即用,它支持每个唯一网址的一个控制器。 所以,假设我的 routes.php 文件中有以下网址:
$route['default_controller'] = "homepage";
$route['404_override'] = "homepage/not_found";
$route['^products$'] = "product/list";
$route['^product/(:any)$'] = "product/details";
我的网址将如下所示:
在我构建产品列表的控制器中,我为每个产品创建了这样的URL:
$this->db->from('products');
$products_result = $this->db->get();
$data['products'] = array();
foreach ($products_result->result() as $row)
{
$data['products'][] = array(
'title' => $row->title,
'image' => $row->image,
'url' => site_url('product/' . $row->url)
);
}
$this->load->view('products/list_view', $data);
但每个网址都有太多的冗余。每当我想在某个地方回应它时,我必须写下url。如果我想更改网址,我必须打开每个php文件并替换它们。
问题:是否有“方法”我可以用来调用控制器名称及其方法,“方法”会返回该控件的URL吗?像这样:
build_site_url('product/details', array('my-product-url'));
其中第一个参数是控制器及其方法(因为url模式只存在一个控制器),第二个参数是url部分的数组。
答案 0 :(得分:1)
您正在寻找的功能称为反向路由。目前CodeIgniter中没有内置这样的功能,我能找到的任何库都是在2010年完成的,所以可能不是最新的。
但是,有关于反向路由的文章和拉取请求,所以如果你有足够的经验,你应该能够为你的应用程序放在一起。
否则,您最好的选择可能是为最常见的网址(例如您的产品)创建帮助程序。所以你可以做echo product_url('my-product-name');
之类的事情,你只需要在辅助函数中调整URL。
答案 1 :(得分:0)
我不确定您想要的是什么,但您可以使用_remap()
函数覆盖控制器行为;
看:http://ellislab.com/codeigniter/user-guide/general/controllers.html#remapping
e.g。
public function _remap($method){
if ($method == 'product/details') {
///do what you want to do
}
答案 2 :(得分:0)
您可以在产品控制器中使用默认查找功能(在CI Routing docs中描述;请查看示例)。
$route['product/(:any)'] = "catalog/product_lookup";
包含“product”作为第一个段的URL,以及第二个段中的任何内容 将被重新映射到“目录”类和“product_lookup” 方法
或者您可以使用数据库驱动的路线 将表product_slugs添加到MySQL数据库:
CREATE TABLE IF NOT EXISTS `product_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( 'product_slugs' );
$result = $query->result();
foreach( $result as $row )
{
$route[ $row->slug ] = 'product/detail/$1;
}
您需要做的就是在创建产品条目时创建记录并完成:
INSERT INTO `product_slugs` (`slug`) VALUES ('name-of-the-product');