2016-04-04 39 views
1

我有一個包裝師/作曲家的公開包。我可以使用後備更改PSR 4自動加載命名空間嗎?

最初它爲文件src/Class.php使用PSR-4 \ GitHubUser \ Package \ Class自動加載。

我想將其縮短到\ Package \ Class中以獲得相同的文件。這很容易通過更改composer.json來完成。但是有沒有一種方法可以讓人們使用現有的更長時間的呼叫進行回退? (自動加載這兩個?)

我想什麼:

"autoload": { 
    "psr-4": { 
     "PackageName\\": "src", 
     "User\\OldPackageName\\": "src" 
    } 
} 

但它不註冊的第二個呼叫爲同一個文件夾。

回答

1

你必須找到一種方式,一個被加載的文件定義了正確的單個類或兩個類。它可能是可行的,也許重複代碼,擴展類或其他東西。

另一方面,這是不兼容的更新版本的用途。你可以永遠支持舊名稱,或者你可以減少這個遺留問題,只支持新名稱(爲什麼你首先改變它?)。

Composer將不會更改代碼中的namespace行,因此自動裝入器中的前綴不能隨意更改 - 必須位於代碼中。還要注意,爲了與PSR1引用的PSR4兼容,每個文件只允許有一個類。

這種嘗試的目標是什麼?爲了使舊的軟件包名稱可供公衆使用,您可以決定再延長一些舊版本,即應用功能和安全修復程序。新版本將標記更高的主版本號,並且也受支持。遷移指南會指出,更新的唯一要求是更改名稱空間,其他任何內容都是相同的。這會產生一個更清潔的升級路徑,因爲您可以單獨測試兩個版本,並且不要忘記角落案例。

另外,如果來自舊命名空間的類爲新類提供了一個類型提示(反之亦然),那麼您也不會遇到類型提示的問題(並且這可能無法在代碼中更改 - 至少也是這樣不尋常的是我想考慮一個解決方案)。

TLDR:對這兩個名稱空間不兼容的包使用兩個主要版本,併爲用戶提供易於執行的升級說明。

+0

謝謝你,一個非常全面的答案。原因是比任何東西都更審美,我很想知道是否有可能......我正在考慮恢復原狀而不是現在改變它(即使我不喜歡它,改變它也是一種痛苦) –

相關問題