Fecshop index.php初始化

2018-05-24 14:15 更新

Fecshop index.php初始化

對(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)載、引用,但需署名作者且注明文章出處。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)