這里說(shuō)明的是fecshop的文件結(jié)構(gòu),執(zhí)行流程等知識(shí)。
https://github.com/fancyecommerce/yii2_fecshop
這個(gè)是FecShop的核心包,里面包含 入口系統(tǒng)(appfront Appadmin等) ,以及對(duì)應(yīng)的模塊配置,還包含擴(kuò)展的yii2 component, 重寫(xiě)的yii2的類(lèi),以及fecshop services(服務(wù)),model,shell(命令行), migrations(數(shù)據(jù)庫(kù)安裝)等等。
這個(gè)包類(lèi)似yiisoft/yii2,將fecshop核心代碼以擴(kuò)展的方式制作, 是為了解決fecshop升級(jí)和yii2二次開(kāi)發(fā)者重新擴(kuò)展fecshop的沖突
https://github.com/fancyecommerce/yii2_fecshop_app_advanced
這個(gè)是fecshop的web入口包,里面有 appadmin/web
,appfront/web
,
以及圖片web的路徑,nginx解析到這些路徑,就可以進(jìn)行訪問(wèn)了
,入口文件index.php就在這個(gè)包中,index.php中加載fecshop核心代碼的配置.
這個(gè)包類(lèi)似 https://github.com/yiisoft/yii2-app-advanced
,
起到一個(gè)web訪問(wèn)路徑,加載fecshop核心代碼的作用,
安裝這個(gè)包后,fecshop核心包,會(huì)以擴(kuò)展依賴(lài)的方式被加載過(guò)來(lái),同樣yii2的核心庫(kù)
也是這樣。
其他的不一一列舉,這個(gè)安裝后在vendor文件夾下面可以查看, 這里面有兩個(gè)我開(kāi)發(fā)的擴(kuò)展
DWZ(JUI)和yii2整合的后臺(tái)擴(kuò)展: https://github.com/fancyecommerce/yii2_fec_admin
基礎(chǔ)封裝擴(kuò)展: https://github.com/fancyecommerce/yii2-fec
對(duì)這個(gè)有疑問(wèn)的朋友也比較多,為什么要做成擴(kuò)展包,原因:
要解決fecshop升級(jí)和使用者二開(kāi)的文件沖突問(wèn)題。 使用者無(wú)權(quán)修改/vendor/fancyecommerce/fecshop下面的文件,只能通過(guò)配置的方式進(jìn)行 重寫(xiě),如果強(qiáng)制修改/vendor/fancyecommerce/fecshop下面的文件,升級(jí)后將會(huì)被清除。
打開(kāi)vendor/fancyecommerce/fecshop
,這里就是fecshop的核心代碼包。
@fecshop/app
里面 是各個(gè)入口系統(tǒng)的文件代碼,包含
@fecshop/app/appadmin
,@fecshop/app/appfront
等。
@fecshop/app/appfront
這里是前端pc代碼,打開(kāi)@fecshop/app/appfront
,可以看到如下文件夾:
@fecshop/app/appfront/config #appfront的配置代碼部分
@fecshop/app/appfront/helper #appfront的各個(gè)模塊的公用helper類(lèi)
@fecshop/app/appfront/languages #appfront的語(yǔ)言翻譯包部分
@fecshop/app/appfront/modules #appfront的模塊部分
@fecshop/app/appfront/theme #appfront的模板theme部分
@fecshop/app/appfront/widgets #appfront的小部件數(shù)據(jù)提供部分,這里的小部件是一個(gè)展示塊,譬如頁(yè)面的頂部,底部,側(cè)欄顯示產(chǎn)品瀏覽記錄等等,就是顯示的一個(gè)區(qū)塊。
@fecshop/app/appfront/modules
此文件夾下面的各個(gè)文件夾都是一個(gè)模塊,下面是詳細(xì)說(shuō)明
@fecshop/app/appfront/config` #模塊的配置文件夾
@fecshop/app/appfront/modules/AppfrontController.php #是各個(gè)模塊中controller的基類(lèi)。
@fecshop/app/appfront/modules/AppfrontModule.php #是各個(gè)模塊的Module.php的基類(lèi)。
進(jìn)入catalog 這個(gè)模塊,你會(huì)看到
@fecshop/app/appfront/modules/catalog/block # 模塊的中間邏輯層
@fecshop/app/appfront/modules/catalog/controllers # 模塊的控制層文件
@fecshop/app/appfront/modules/catalog/helpers # 模塊的幫助類(lèi)文件
@fecshop/app/appfront/modules/catalog/Module.php # 模塊的入口文件,也就是在配置文件中指定該文件。
需要說(shuō)明的是block是fecshop新加的一個(gè)層, 按照MVC邏輯,model的數(shù)據(jù)返回給controller中,這會(huì)造成controller 非常的膨大,因此,新加層后,fecshop的數(shù)據(jù)傳遞過(guò)程為:
用戶(hù)訪問(wèn)-->fecshop初始化--->controller--->block--->services--->model
。
model從數(shù)據(jù)庫(kù)得到數(shù)據(jù),然后返回?cái)?shù)據(jù):
model--->services--->block--->controller--->view-->反饋給用戶(hù)html
很多的數(shù)據(jù)的中間邏輯處理,都是在block層完成。
controller只負(fù)責(zé)調(diào)度,這樣層次比較分明,參看詳細(xì)代碼,您應(yīng)該就會(huì)看明白詳細(xì)。 譬如:
fecshop\app\appfront\modules\Catalog\controllers\ProductController
中的方法:
public function actionIndex()
{
$data = $this->getBlock()->getLastData();
return $this->render($this->action->id,$data);
}
$this->getBlock()
返回的是
fecshop\app\appfront\modules\Catalog\block\product\Index.php
對(duì)應(yīng)的對(duì)象,
執(zhí)行Index對(duì)象的getLastData()
方法,返回給$data數(shù)組,然后,render函數(shù)將
數(shù)據(jù)傳遞給view層。
加入block層除了文件結(jié)構(gòu)的層次分明,還會(huì)更好的重用函數(shù),精簡(jiǎn)代碼。
@fecshop/app/appfront/theme
這里是fecshop的模板部分,fecshop是在yii2基礎(chǔ)上進(jìn)行了二次修改封裝, 使用的是多模板系統(tǒng),關(guān)于fecshop多模板,你可以看我的博文:
yii2 多模板路徑優(yōu)先級(jí)加載view方式下- js和css 的解決
這是fecshop擴(kuò)展的component(yii2 組件),這里只有一個(gè)store.php,這個(gè)概念屬于yii2的知識(shí)
各個(gè)app,譬如appfront appadmin公用的配置部分,里面大多數(shù)的配置是對(duì)services的配置。
公用接口
一些第三方的類(lèi)庫(kù)
這個(gè)是在安裝fecshop對(duì)應(yīng)的數(shù)據(jù)庫(kù)部分,執(zhí)行后,您的本地將會(huì)安裝 數(shù)據(jù)庫(kù)表,索引,以及數(shù)據(jù)。
數(shù)據(jù)庫(kù)對(duì)應(yīng)的models
Fecshop 服務(wù),是各個(gè)app端公用的service,是fecshop的底層部分
執(zhí)行的腳本部分。
重寫(xiě)的yii2的文件存放的路徑。
功能重寫(xiě):要滿(mǎn)足在不修改源文件代碼的前期下修改FecShop的功能, 這樣才能滿(mǎn)足fecshop的升級(jí)。
安裝fecshop后,在安裝的根目錄,您會(huì)看到各個(gè)app開(kāi)頭文件夾,譬如appadmin,appfront,apphtml5, appapi,appserver等, 這個(gè)部分是屬于二次開(kāi)發(fā)用戶(hù)的,您可以在里面添加配置,添加文件等等,進(jìn)行二次開(kāi)發(fā)操作, 譬如在/appfront這個(gè)入口舉例:
重寫(xiě)原來(lái)fecshop預(yù)設(shè)的翻譯,譬如
@appfront/languages/zh_CN/appfront.php中添加配置
<?php
return [
'Follow Us' => '關(guān)注我們',
];
即可覆蓋fecshop的翻譯
@fecshop/app/appfront/languages/zh_CN/appfront.php
中的Follow Us翻譯。
不同的store,可以設(shè)置不同的語(yǔ)言,不同的默認(rèn)貨幣,不同的模板
,fecshop的模板是在store中進(jìn)行配置的,
打開(kāi)配置文件:@appfront/config/fecshop_local_services/Store.php
,
即可為每一個(gè)store設(shè)置本地模板路徑,本地路徑的文件會(huì)覆蓋fecshop模板路徑的文件,
這個(gè)是按照文件路徑進(jìn)行的覆蓋。
store:fecshop.appfront.fancyecommerce.com/fr
設(shè)置的localThemeDir
為@appfront/theme/terry/theme01
.
覆蓋方法:
fecshop的appfront模板路徑為:@fecshop/app/appfront/theme/base/front
如果我想重寫(xiě) fecshop appfront 模板路徑里面的 catalog/product/index.php
,那么我在本地模板路徑 @appfront/theme/terry/theme01
下面新建文件
@appfront/theme/terry/theme01/catalog/product/index.php
,即可完成重寫(xiě)覆蓋。
這個(gè)是Yii2的知識(shí)。您在@appfront/config/fecshop_local_modules
下面添加一個(gè)配置文件
,重新設(shè)置class指向的地址,就可以完全重寫(xiě)這個(gè)模塊了
這個(gè)是yii2的知識(shí),添加配置覆蓋class即可
您在@appfront/config/fecshop_local_services
下面添加一個(gè)配置文件,覆蓋class即可
,譬如重寫(xiě)fecshop product服務(wù),新建文件@appfront/config/fecshop_local_services/Product.php
,填寫(xiě)內(nèi)容:
return [
'product' => [
'class' => 'fecshop\services\Product',
],
]
將里面的class對(duì)應(yīng)的路徑,換成您自己的路徑即可,然后新建您配置的路徑文件,
繼承fecshop\services\Product
,如果重新里面的方法即可。
您可以通過(guò)classMap
的方式,實(shí)現(xiàn)任意重寫(xiě),
這種方式適合對(duì)單個(gè)文件進(jìn)行重寫(xiě),無(wú)論是yii2的文件,還是fecshop,還是第三方開(kāi)發(fā)
的,都同樣適合,您可以在
@appfront/config/YiiClassMap.php
里面添加對(duì)應(yīng)關(guān)系,
具體的實(shí)現(xiàn)思路和原理參看我的博文:
通過(guò)配置的方式重寫(xiě)某個(gè)Yii2 文件 或第三方擴(kuò)展文件
總之,您可以在不修改vendor下面的任何文件的前提下(yii2 和 fecshop核心代碼),在appfront路徑下面,你可以二開(kāi)屬于自己的功能,和重寫(xiě)fecshop,yii2的功能。 擴(kuò)展的功能。 這么不做詳細(xì)敘述。
更多建議: