Fecshop Request Url初始化

这里讲述的是在fecshop初始化的过程中,Request Url部分的初始化

当我们访问 https://fecshop.appfront.fancyecommerce.com/raglan-sleeves-letter-printed-crew-neck-sweatshirt-53386451-77774122,

这是一个伪静态的url,为了seo,下面我们说一下具体的实现过程

需要seo的入口,只有appfont apphtml5这两个入口,对于appserver,appapi等入口 是不需要的,因此这个配置是在入口中的配置加载 ,下面以appfront入口为例介绍

3.1、request component config

yii2的url的初始化是在 request component 中,打开文件: @fecshop/app/appfront/config/appfront.php配置文件可以看到:

'request' => [
    'class' => 'fecshop\yii\web\Request',
    ...
]

我们打开这个文件: @fecshop\yii\web\Request.php, 可以看到该文件将\yii\web\RequestresolveRequestUri() 方法进行了重写,在86行可以看到代码: Yii::$service->url->getOriginUrl($urlKey); ,指的是通过url services 的getOriginUrl()方法,得到原来的urlkey,也就是将 https://fecshop.appfront.fancyecommerce.com/raglan-sleeves-letter-printed-crew-neck-sweatshirt-53386451-77774122, ,解析出来urlKey:raglan-sleeves-letter-printed-crew-neck-sweatshirt-53386451-77774122 然后通过Yii::$service->url->getOriginUrl($urlKey);,去数据库中查询出来原来的 urlkey,也就是,去mongodb数据库(默认是放到mongodb里面), url_rewrite表中查询:

{
 "custom_url_key": "/raglan-sleeves-letter-printed-crew-neck-sweatshirt-53386451-77774122"
}

得到的结果为:

 {
   "_id": ObjectId("580835d0f656f240742f0b7d"),
   "created_at": NumberLong(1476933072),
   "updated_at": NumberInt(1512465616),
   "type": "system",
   "custom_url_key": "/raglan-sleeves-letter-printed-crew-neck-sweatshirt-53386451-77774122",
   "origin_url": "/catalog/product/index?_id=580835d0f656f240742f0b7c"
}	

查询得到结果为: /catalog/product/index?_id=580835d0f656f240742f0b7c

这样就找到了原来的url。

对于Yii::$service->url,对应的class文件:@fecshop/services/Url.phpactionGetOriginUrl($urlKey)方法

 protected function actionGetOriginUrl($urlKey)
    {
        return Yii::$service->url->rewrite->getOriginUrl($urlKey);
    }

进而执行的是 @fecshop/services/url/Rewrite.php

进而执行的是 @fecshop/services/url/rewrite/RewriteMongodb.php

public function getOriginUrl($urlKey)
{
    $UrlData = $this->_urlRewriteModel->find()->where([
        'custom_url_key' => $urlKey,
    ])->asArray()->one();
    if ($UrlData['custom_url_key']) {
        return $UrlData['origin_url'];
    }
}