我正在嘗試制作一個作曲家包,但我正在努力設置自動加載以在我正在開發它的項目中工作。我有兩個項目:Project Foo(我正在其中開發包)。項目欄(我在其中安裝了包:)composer require myhandle/mypackage。在 Project Foo 中,我(顯然)也必須能夠使用該包。但是在我自己的包中設置自動加載不起作用。然而...當我將更改提交到 Github、在 Packagist 更新包并composer update在 Project Bar 中運行時,它就可以工作了(?!)。奇怪的是......如果我composer update從 Project Foo (該項目不起作用)中進行操作。因此,將軟件包更新到當前版本(?),使其開始工作。所以它一定與我如何設置自動加載有關。一張紙條:我通過在供應商目錄中創建一個新的(空)文件夾來啟動該包,然后在那里構建該包。我認為這很聰明,因為它會反映出如果我有composer required包裹的話它會是什么樣子。我不知道這是否是不好的做法,因為 Composer 不再“控制”供應商目錄中的所有文件。有大量關于如何制作 Composer 包的指南,但沒有一個指南解釋了在正在開發包的項目中構建文件的好方法。以下是我為“獲取錯誤”所做的操作(在 Project Foo 中):創建新的類文件,例如:myhandle/mypackage/src/Test.php然后我像這樣實例化它:$test = new MyNamespace\MyPackageName\Test();然后我收到錯誤:致命錯誤:未捕獲錯誤:未找到類“MyNamespace\MyPackageName\Test”這就是 Project Bar 中的工作原理(完全相同的代碼)。我找不到有關如何在我正在開發的包中正確設置自動加載的指南。我正在使用這個自動加載文件,這是我在另一個作曲家項目中找到的。我已將其放在我的項目的根目錄中。它看起來像這樣:<?phpnamespace MyNamespace\MyPackageName;spl_autoload_register(function($cls) { $cls = ltrim($cls, '\\'); if (strpos($cls, __NAMESPACE__) !== 0) { return; } $classWithoutBaseNamespace = str_replace(__NAMESPACE__, '', $cls); // Load files from 'src' directory based on their class name without // the StoutLogic\AcfBuilder namespace. $path = dirname(__FILE__). DIRECTORY_SEPARATOR. 'src'. str_replace('\\', DIRECTORY_SEPARATOR, $classWithoutBaseNamespace). '.php'; require_once($path);});我在 Composer 文檔中找不到它,如何在新項目/包中設置它。不過,我可以找到無數關于如何使用自動加載的指南。
1 回答

慕斯王
TA貢獻1864條經驗 獲得超2個贊
檢查getcomposer.org上有關自動加載的文檔
刪除您的自定義自動加載器定義,在composer.json 中注冊您的命名空間(希望您已經遵循 PSR-4),運行composer dump-autoload
.
最后但并非最不重要的一點是,無論您何時何地需要使用它,只需包含
require?__DIR__?.?'/vendor/autoload.php';
- 1 回答
- 0 關注
- 115 瀏覽
添加回答
舉報
0/150
提交
取消