2015-08-29 27 views
1

我有這樣的結構,我的應用程序,Composer自動加載psr 4通配符擴展用於匹配所有模塊?

myapp/ 
    config/ (config and setup) 
    module/ (tons of modules!) 
    Article/ (one of the modules) 
     source/ (<----- note that all php psr4 classes are stored in this folder) 
      Article 
       Model/ 
       ArticleModel.php 
       ArticlesModel.php 
       Controller/ 
       View/ 
    Book/ (one of the modules) 
     ....(the structure is the same as Article's) 
    public/ (web site doc root) 
    vendor/ 
    composer/ 
    ...(other packages) 

,這是我composer.json,

{ 
    "require": { 
     "slim/slim": "~2.0", 
     "slim/views": "0.1.*" 
    }, 
    "autoload": { 
     "psr-4": { 
      "Foo\\": [ 
       "module/*/source/" 
      ] 
     }, 
     "psr-0": { 
      "": "library/" 
     } 
    } 
} 

正如你可以看到,我有這個"module/*/source/"在以.json。我這樣做的原因是因爲我想避免編寫每個模塊,因爲它將成爲長列表。當我有新的模塊時它也不靈活,那麼我必須對.json進行更改。

但是"module/*/source/"不起作用。那麼我可以在這個.json中使用正則表達式或其他東西,這樣它就足夠「聰明」,可以拾取所有模塊了?如,

"module/Artcle/source/" 
"module/Book/source/" 
"module/Contact/source/" 
"module/Admin/Article/source/" 
"module/Admin/Book/source/" 
"module/Admin/Contact/source/" 
.... 

這可能嗎?

回答

2

目前,你不能有一個自動加載定義的目錄路徑通配符。

但是,您可以調整您的項目以允許通過更改目錄結構來自動加載任何類別的模塊。你必須擺脫沒有在完全合格的類名中提到的所有級別,即沒有「源」

「Article/source/Article/Model/ArticleModel.php」承載\Foo\Article\Model\ArticleModel將被要求居住在「文章/模型/ ArticleModel.php「

總是可能的選擇是提及自動加載中的所有模塊,或將它們自己分成Composer包。

關於性能的備註:始終嘗試使用自動加載可能的最長前綴。 "psr-0": { "" : "library" }將強制Composer查看該庫目錄並搜索您加載的所有類的匹配文件。雖然作曲家試圖通過記住故障來優化這一點,但它仍然有影響。

您應該始終添加唯一標識類位置的前綴,並且您可以添加指向PSR-0相同位置的多個前綴。在PSR-4中,地點的性質不同。

考慮編寫一個腳本來生成自動加載定義。

+0

感謝您的回答。我希望Composer在自動載入定義中有通配符擴展,因爲它可以在'require'中做到這一點,例如''slim/views「:」0.1。*「'但不能' 「自動加載」'。 – laukok

+1

在Github上爲它創建一個問題。 – Sven

+0

只是做到了。謝謝。 – laukok

0

這裏,應該工作

module\/.*?\/source\/ 

注意從你的模式"module/*/source/",在這裏*還將在bash外殼做工精良,這就是所謂的globbing(路徑擴展)。

信息

要完成在JSON路徑擴展,你可以使用JSONPath其中有這裏一個簡單的例子

的XPath VS JSONPath

的XPath:/store/*

JSONPath :$.store.*

編號:http://goessner.net/articles/JsonPath/

+0

nope。它不起作用... – laukok

+0

我認爲答案也許不能,因爲json是一個純粹的數據對象。可能的方式可能會稍後使用php進行處理。 – fronthem

+0

這裏https://en.wikipedia.org/wiki/JSON#Unsupported_native_data_types告訴你,JSON不支持正則表達式數據類型,這可能意味着JSON中的路徑名擴展是不可能的。 – fronthem