从控制器的路由加载URL

时间:2013-05-20 11:23:26

标签: php codeigniter

由于 CodeIgniter 开箱即用,它支持每个唯一网址的一个控制器。 所以,假设我的 routes.php 文件中有以下网址:

$route['default_controller']  = "homepage";
$route['404_override']        = "homepage/not_found";

$route['^products$']          = "product/list";
$route['^product/(:any)$']    = "product/details";

我的网址将如下所示:

  1. 产品列表=> http://www.mywebsite.com/products
  2. 产品详情=> http://www.mywebsite.com/product/my-custom-product
  3. 在我构建产品列表的控制器中,我为每个产品创建了这样的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部分的数组。

3 个答案:

答案 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');