我是照著教程(learnku 的 LX2 教程)寫了一個包. 開發完成後, 因為擴充套件包依賴 laravel 的模型類和資料庫連線.所以需要將開發中的包複製到一個laravel專案下進行測試.
這裡主要是擴充套件包需要運算元據庫.一開始想的是.如果這個包將來只在laravel專案中使用,那麼在擴充套件包中使用模型類,並且繼承框架的模型基類再建好對應的資料表.透過laravel的資料庫連線和模型基類就可以實現資料庫操作了.
一開始想的特別簡單, 因為平常用的很方便. 只要 composer require 擴充套件包的名稱 然後專案中就可以直接 use ,然後 new 出來了. 然後平常安裝的包總是 vendor 下, 所以就自己新建了一個 laravel 專案, 在 vendor 下新建了一個目錄然後把包 copy 到了 目錄下; 如下圖所示:
bboyyue 是我自己的名字, keyword 是擴充套件包的名字.
然後編寫單元測試,發現沒有載入進來.
然後此時就特別奇怪,諮詢了大佬,大佬說我可以直接在 psr-4 下面手動寫上 名稱空間和擴充套件包的路徑,就可以自動載入.
這裡注意加 src 是沒錯的. 我一開始沒加, 大佬給與了指正.但是加完還是不行,依舊是 Class not found.
大佬又給予了我很多的提醒和指導 , 包括左邊應該是擴充套件包中使用的名稱空間, 右邊不要多加 / 或者 \ .以及 修改自動載入項之後要注意. composer dump-auto . 依舊不行. 後來瞭解到大佬使用 tp 比較多. 他一般都是在根目錄下新建 packagist 目錄, 然後右邊一般都是 packagist/user/擴充套件包的名稱/src 這樣的路徑. 於是我把我的右邊改成了 vendor/user/擴充套件包的名稱/src 這樣的路徑.
終於不是 not found 了.
但是到這裡還是不理解.為什麼別的 vendor 下的包都不需要加 vendor . 我的就需要 (別的不在 psr-4 這裡寫)
然後檢視 autoload.php 檔案.
當我的右邊的路徑包含 vendor 的時候, composer dump_auto 後的 autoload_psr4.php 中 Bboyue\Keyword\ 的對應值裡面的變數就會變成 $vendor, 反之就會變為 $base. $base 是根目錄.所以大佬的 tp5 直接放在根目錄或者新建目錄的方式也可以自動載入. 看到這裡, 問題基本上已經解決了. 但是有時候研究了半天,不研究的明明白白就睡不著. 所以又檢視了 composer 的原始碼.
瞭解了 composer dump-auto 的原理.
- 找到 dump-auto 的檔案
- 發現這裡有一個 dump 方法
- dump 方法是上面 getAutoloadGenerator() 返回的類的例項 (AutoloadGenerator)
- 找到dump方法
- 可以看到 dump-auto 最後把 php 程式碼寫入到了 autoload_psr4.php ,然後這裡透過 getPathCode() 方法對路徑進行了驗證,如果包的路徑中如果包含了 $vendorPath 就會返回 $vendorDir;
- $package 在$composer 初始化沒多久就已經有了, 懷疑是在初始化的時候就已經讀取到記憶體了.
今天晚上不行了, 明天還要上班
—– 作者是小白,以上所有的分析僅供參考.如有錯誤 歡迎指正.
本作品採用《CC 協議》,轉載必須註明作者和本文連結