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