對(duì)于入口文件index.php, Fecshop進(jìn)行了更改,下面是對(duì)更改的詳細(xì)說(shuō)明。
入口文件代碼為:
<?php
ini_set('session.cookie_domain', '.fancyecommerce.com');
$homeUrl = 'http://'.$_SERVER['HTTP_HOST'].rtrim(dirname($_SERVER['SCRIPT_NAME']), '\\/');
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
require(__DIR__ . '/../../../vendor/autoload.php');
require(__DIR__ . '/../../../vendor/fancyecommerce/fecshop/yii/Yii.php');
require(__DIR__ . '/../../../common/config/bootstrap.php');
require(__DIR__ . '/../../config/bootstrap.php');
$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/../../../common/config/main.php'),
require(__DIR__ . '/../../../common/config/main-local.php'),
require(__DIR__ . '/../../config/main.php'),
require(__DIR__ . '/../../config/main-local.php'),
# fecshop services config
require(__DIR__ . '/../../../vendor/fancyecommerce/fecshop/config/fecshop.php'),
# fecshop module config
require(__DIR__ . '/../../../vendor/fancyecommerce/fecshop/app/appfront/config/appfront.php'),
# thrid part confing
# common modules and services.
require(__DIR__ . '/../../../common/config/fecshop_local.php'),
# appadmin local modules and services.
require(__DIR__ . '/../../config/fecshop_local.php')
);
$config['homeUrl'] = $homeUrl;
/**
* 添加fecshop的服務(wù) ,Yii::$service , 將services的配置添加到這個(gè)對(duì)象。
* 使用方法:Yii::$service->cms->article;
* 上面的例子就是獲取cms服務(wù)的子服務(wù)article。
*/
new fecshop\services\Application($config['services']);
unset($config['services']);
$application = new yii\web\Application($config);
$application->run();
詳細(xì)分析如下:
index.php初始化
1.error_reporting(E_ALL || ~E_NOTICE);
作用:除去 E_NOTICE 之外的所有錯(cuò)誤信息
2.ini_set('session.cookie_domain', '.fancyecommerce.com');
這里需要填寫您的域名,fecshop是支持多語(yǔ)言store的,各個(gè)語(yǔ)言可以用不同的子域名,為了在多個(gè)域名之間共享session(購(gòu)物車,登錄信息都是基于session), 在語(yǔ)言進(jìn)行切換的時(shí)候,購(gòu)物車和登錄信息不被丟失,需要做session共享,當(dāng)然,您也可以在php.ini里面設(shè)置該值,不過(guò)在這里設(shè)置更加靈活
3.$homeUrl = 'http://'.$_SERVER['HTTP_HOST'].rtrim(dirname($_SERVER['SCRIPT_NAME']), '\\/');
該代碼是為了取到當(dāng)前的home url,也就是網(wǎng)站的根URL,對(duì)于fecshop的多語(yǔ)言,你可以使用www.fecshop.com es.fecshop.com fr.fecshop.com這種子域名 作為不同語(yǔ)言的home url, 您也可以使用單域名不同后綴的方式,譬如www.fecshop.com , www.fecshop.com/es , www.fecshop.com/fr 這種方式作為homeUrl,如果使用單域名后綴方式,需要到@app/web下面新建一個(gè)es fr文件夾,@appfront/web/fr 下面有例子。
4.defined('YII_DEBUG') or define('YII_DEBUG', true);
這個(gè)是Yii2的代碼,是用來(lái)確定是否開啟debug
5.defined('YII_ENV') or define('YII_ENV', 'dev');
這個(gè)是Yii2的代碼,用來(lái)確定環(huán)境是dev(開發(fā)環(huán)境)還是prod(生產(chǎn)環(huán)境)
6.require(__DIR__ . '/../../vendor/autoload.php');
這個(gè)是Yii2的代碼
7.require(__DIR__ . '/../../vendor/fancyecommerce/fecshop/yii/Yii.php');
這個(gè)是fecshop重寫的Yii.php,主要的修改就是添加一個(gè)類靜態(tài)變量 public static $service;
,
該變量作為fecshop service的入口,譬如調(diào)用order service的代碼為:
Yii::$service->order
8.require(__DIR__ . '/../../common/config/bootstrap.php');
這個(gè)文件的內(nèi)容如下:
<?php
Yii::setAlias('@common', dirname(__DIR__));
Yii::setAlias('@console', dirname(dirname(__DIR__)) . '/console');
Yii::setAlias('@appadmin', dirname(dirname(__DIR__)) . '/appadmin');
Yii::setAlias('@appfront', dirname(dirname(__DIR__)) . '/appfront');
Yii::setAlias('@apphtml5', dirname(dirname(__DIR__)) . '/apphtml5');
Yii::setAlias('@appserver', dirname(dirname(__DIR__)) . '/appserver');
Yii::setAlias('@appapi', dirname(dirname(__DIR__)) . '/appapi');
Yii::setAlias('@appimage', dirname(dirname(__DIR__)) . '/appimage');
Yii::setAlias('@Facebook', dirname(dirname(__DIR__)) . '/vendor/fancyecommerce/fecshop/lib/Facebook');
Yii::setAlias('@google', dirname(dirname(__DIR__)) . '/vendor/fancyecommerce/fecshop/lib/google');
主要是添加一些Alias
9.require(__DIR__ . '/../config/bootstrap.php');
在appfront/config/bootstrap.php 可以添加當(dāng)前入口獨(dú)有的東西
10.
$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/../../common/config/main.php'),
require(__DIR__ . '/../../common/config/main-local.php'),
require(__DIR__ . '/../config/main.php'),
require(__DIR__ . '/../config/main-local.php'),
# fecshop services config
require(__DIR__ . '/../../vendor/fancyecommerce/fecshop/config/fecshop.php'),
# fecshop module config
require(__DIR__ . '/../../vendor/fancyecommerce/fecshop/app/appfront/config/appfront.php'),
# thrid part confing
# common modules and services.
require(__DIR__ . '/../../common/config/fecshop_local.php'),
# appadmin local modules and services.
require(__DIR__ . '/../config/fecshop_local.php')
);
上面的代碼是將所有的配置文件進(jìn)行合并,后面的數(shù)組配置將覆蓋前面的數(shù)組配置,譬如:
require(__DIR__ . '/../config/fecshop_local.php')
將覆蓋require(__DIR__ . '/../../common/config/fecshop_local.php'),
里面的數(shù)組配置。
另外需要注意的是,上面的有一些配置文件又會(huì)包含其他的配置文件,譬如代碼:
<?php
## 本文件在app/web/index.php 處引入。
## fecshop的核心模塊
$modules = [];
foreach (glob(__DIR__ . '/fecshop_local_modules/*.php') as $filename){
$modules = array_merge($modules,require($filename));
}
## 服務(wù)器組件
$services = [];
foreach (glob(__DIR__ . '/fecshop_local_services/*.php') as $filename){
$services = array_merge($services,require($filename));
}
return [
'modules'=>$modules,
'services' => $services,
];
將 ./fecshop_local_modules/*.php 下面所有的配置文件都包含進(jìn)來(lái)
配置文件的合并,還是耗費(fèi)一定時(shí)間的,為了性能高效,您可以將config數(shù)組緩存起來(lái), 直接從緩存文件或者內(nèi)存數(shù)據(jù)庫(kù)redis中直接讀取,加快初始化。
11.$config['homeUrl'] = $homeUrl;
設(shè)置配置的htmlUrl
12.
$yiiClassMap = require(__DIR__ . '/../config/YiiClassMap.php');
if(is_array($yiiClassMap) && !empty($yiiClassMap)){
foreach($yiiClassMap as $namespace => $filePath){
Yii::$classMap[$namespace] = $filePath;
}
}
上面是設(shè)置classMap,通過(guò)classMap您可以重寫任何一個(gè)文件,關(guān)于classMap的詳細(xì),你可以參看文檔 http://www.yiichina.com/doc/guide/2.0/concept-autoloading#class-map, 通過(guò)classMap可以將namespace進(jìn)行重定向,譬如
<?php
namespace fecshop\services;
use Yii;
use yii\base\InvalidValueException;
use yii\base\InvalidConfigException;
use fec\helpers\CSession;
class Coupon extends Service
{
}
?>
我通過(guò)
Yii::$classMap['fecshop\services\Coupon'] = '@appfront/services/Coupon.php';
當(dāng)我引入
use fecshop\services\Coupon
,系統(tǒng)就會(huì)執(zhí)行重定向的這個(gè)文件@appfront/services/Coupon.php
,
而不是@fecshop/services/Coupon.php
,這就是classMap的作用,當(dāng)然,也起到加速的作用,不需要php去
查找文件,對(duì)于Yii2的幾個(gè)核心文件,都是添加到了classMap中了。詳細(xì)參看文件vendor\yiisoft\yii2\classes.php
,
下面是列出這個(gè)文件的部分代碼:
<?php
return [
'yii\base\Action' => YII2_PATH . '/base/Action.php',
'yii\base\ActionEvent' => YII2_PATH . '/base/ActionEvent.php',
'yii\base\ActionFilter' => YII2_PATH . '/base/ActionFilter.php',
'yii\base\Application' => YII2_PATH . '/base/Application.php',
'yii\base\ArrayAccessTrait' => YII2_PATH . '/base/ArrayAccessTrait.php',
'yii\base\Arrayable' => YII2_PATH . '/base/Arrayable.php',
13.
new fecshop\services\Application($config['services']);
unset($config['services']);
這里是給Yii類添加服務(wù)配置,將Yii::$service指向 fecshop\services\Application;
原理類似Yii2的組件(component),譬如使用cms 服務(wù)的代碼為Yii::$service->cms
,使用cms服務(wù)的article子服務(wù)的get()方法的代碼為Yii::$service->cms->article->get()
14.
$application = new yii\web\Application($config);
$application->run();
這里是Yii2的初始化,這里不做詳細(xì)敘述。
本文由 fecommerce 創(chuàng)作,采用 知識(shí)共享署名 3.0 中國(guó)大陸許可協(xié)議 進(jìn)行許可。
可自由轉(zhuǎn)載、引用,但需署名作者且注明文章出處。
更多建議: