yii2 url 重写 自定义url

来源:互联网 发布:2016淘宝新店扶持期 编辑:程序博客网 时间:2024/05/23 11:33


在一些开源的电商系统中,我们会看到这样的url:

http://www.intosmile.com/retro-deep-v-neck-irregular-tassels-hem-sleeveless-dress.html

对于这种  retro-deep-v-neck-irregular-tassels-hem-sleeveless-dress.html

肯定不是对应的真实文件,而是一个url的自定义

1.首先我们需要建立一个表 url_rewrite,用来做对应关系

retro-deep-v-neck-irregular-tassels-hem-sleeveless-dress.html   对应到  category/product/index   sku='xxxxxx'

当访问这个url的时候,我们通过表的查询就找到了这些信息,当然,这些信息是产品数据保存的时候,写入了 表:url_rewrite

然后就可以生成把数据取出来


2.在yii2  的代码修改

新建一个类:

<?php/** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */namespace common\web;use frontend\models\core\Store;use frontend\models\core\Config;class Request extends \yii\web\Request

重写 request的getRewriteUri方法

##重写url ,根据得到的url,在 $rewrite_url_arr 中查找是否存在 ,如果存在,##说明这个url是自定义的url,需要更改成真实的url, 更改RequestUri为原来的urlprotected function getRewriteUri($requestUri){$front_requestUri = "";$wh_requestUri = "";$dh_requestUri = "";if(strstr($requestUri,"?")){$arr = explode("?",$requestUri);$front_requestUri = $arr[0];$wh_requestUri = $arr[1];}else if(strstr($requestUri,"#")){$arr = explode("#",$requestUri);$front_requestUri = $arr[0];$dh_requestUri = $arr[1];}else{$front_requestUri = $requestUri;}//echo $requestUri;exit;if($custom_uri = $this->getCustomUrl($front_requestUri)){if($wh_requestUri){return $custom_uri."?".$wh_requestUri;}else if($dh_requestUri){return $custom_uri."#".$dh_requestUri;}else{return $custom_uri;} }else{return $requestUri;}}

辅助方法:这个方法用户获取真实的url  同时,定义个全局变量 $page_handle ,在页面可以获取这个值,里面是产品数据,然后画出页面

#根据当前的自定义uri,得到数据库保存的真实uri。protected function getCustomUrl($uri){# 去掉头部的/if(substr($uri,0,1) == "/"){$uri = substr($uri,1);}$url_rewrite_coll = \Yii::$app->mongodb->getCollection('url_rewrite');$one = $url_rewrite_coll->findOneConvert(['request_path' => $uri]);if($one['_id']){$type = $one['type'];$type_data_id = $one['type_data_id'];Global $page_handle;if($type == 'product'){$product_coll = \Yii::$app->mongodb->getCollection("catalog_product");$where = ["_id"=>(int)$type_data_id,"status"=>1 ];if(!Config::param("out_stock_product_is_show")){$where['is_in_stock'] = 1;}$product_data = $product_coll->findOneConvert($where);if($product_data['_id']){$page_handle = $product_data;return '/catalog/product/index';}}else if($type == 'category'){$category_table = "catalog_category";$category_coll = \Yii::$app->mongodb->getCollection($category_table);$category_data = $category_coll->findOneConvert(["_id"=>(int)$type_data_id,"status"=>1 ]);if($category_data['_id']){$page_handle = $category_data;return '/catalog/category/index';}}else if($type == 'cmspage'){$cmspage_coll = \Yii::$app->mongodb->getCollection("cms_page");$cmspage_data = $cmspage_coll->findOneConvert(["_id"=>(int)$type_data_id,"status"=>1 ]);if($cmspage_data['_id']){$page_handle = $cmspage_data;return '/home/index/page';}# 下一步做。blog没有做。}else if($type == 'blog'){$blog_coll = \Yii::$app->mongodb->getCollection("blog_article");$blog_data = $blog_coll->findOneConvert(["_id"=>(int)$type_data_id,"status"=>1 ]);if($blog_data['_id']){$page_handle = $blog_data;return '/blog/blog/index';}}else if($type == 'blogcategory'){$blogcategory_coll = \Yii::$app->mongodb->getCollection("blog_category");$blogcategory_data = $blogcategory_coll->findOneConvert(["_id"=>(int)$type_data_id ]);if($blogcategory_data['_id']){$page_handle = $blogcategory_data;return '/blog/category/index';}}else{return false;}}else{$rewrite_url_arr = array('contacts'=>'customer/contacts/index',);if($rewrite_url_arr[$uri]){return "/".$rewrite_url_arr[$uri];}return false;}}

写完后,然后配置request,让request 指向这个配置:

'request' => ['class' => 'common\web\Request','enableCookieValidation' => true,'enableCsrfValidation' => true,'cookieValidationKey' => '432-Md23444432432973432423421423@#44@','noCsrfRoutes' => ['catalog/product/addreview',                'favorite/product/remark','paypal/ipn/index','paypal/ipn','catalog/api/product','catalog/api/productdelete','catalog/api/category','catalog/api/categorynew','catalog/api/productnew','customer/contacts/save'//'',//'',],],

class指向我们刚才建立的Requst 

重写了request 就可以实现 这种自定义url了。



1 0
原创粉丝点击