簡體   English   中英

從路由為控制器加載URL

[英]Load url from routes for a controller

CodeIgniter開箱即用時,它為每個唯一的URL支持一個控制器。 因此,假設我的routes.php文件中包含以下URL:

$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

在構建產品列表的控制器中,我為每個產品創建網址,如下所示:

$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都有太多冗余。 每當我想在某處回顯該URL時,都必須編寫該URL。 如果要更改URL,則必須打開每個php文件並全部替換。

問題:沒有可用於調用控制器名稱及其方法的“方法”,並且該“方法”返回該控制器的URL嗎? 像這樣:

build_site_url('product/details', array('my-product-url'));

其中第一個參數是控制器及其方法(因為url模式僅存在一個控制器),第二個參數是url部分的數組。

您正在尋找的是一種稱為反向路由的功能。 目前,CodeIgniter尚未內置此類功能,我可以找到的任何庫都是在2010年完成的,因此可能不是最新的。

但是,這里有一些文章和有關反向路由的請求請求,因此,如果您有足夠的經驗,則應該可以為您的應用程序添加一些東西。

否則,最好的選擇是為最常用的URL(例如產品)創建幫助程序。 因此,您可以執行類似echo product_url('my-product-name'); ,而您只需要在輔助函數中調整URL。

我不確定您到底想要什么,但是您可以使用_remap()函數覆蓋控制器的行為。

外觀: http//ellislab.com/codeigniter/user-guide/general/controllers.html#remapping

例如

public function _remap($method){
   if ($method == 'product/details') {
     ///do what you want to do
   }

您可以在產品控制器中使用默認的查找功能(在CI Routing文檔中進行了介紹 ;請參見示例)。

$route['product/(:any)'] = "catalog/product_lookup";

URL以“ product”作為第一段,第二段中的任何內容都將重新映射到“ catalog”類和“ 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');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM