2017-07-07 137 views
6

我目前正在從事一個需要從其父目錄訪問類的Laravel項目。作曲家自動加載 - 從父目錄加載類

composer.json> PSR-4:

"psr-4": { 
     ... 
     "ModuleA\\": "../ModuleA/baseObjects", 
     "ModuleB\\": "../ModuleB/baseObjects" 
    } 

示例文件結構:

/var/www 
+- /xxx (project) 
    +- /ModuleA 
     +- /baseObjects 
      - configClass.inc 
    +- /ModuleB 
     +- /baseObjects 
      - configClass.inc 
    +- /laravel 
     - composer.json 

我跑composer dump-autoload,但該項目仍然無法找到ModuleA\configClass既不ModuleB\configClass

此外,我autoload_psr4.php內,上述被引用如下:

'MobuleA\\' => array($baseDir . '/../MobuleA/baseObjects') 
'MobuleB\\' => array($baseDir . '/../MobuleB/baseObjects') 

預先感謝您。

+0

試試 「」: 「SRC(主文件夾我猜它)/」 沒有必要只是初始化模塊添加文件夾和/ – DaAmidza

回答

0

嘗試:

"psr-4": { 
     ... 
     "ModuleA\\": "ModuleA/baseObjects", 
     "ModuleB\\": "ModuleB/baseObjects" 
} 
+0

它不起作用,上面的代碼試圖找到它在當前目錄中,我試圖訪問父目錄。 – dzerow

0

根據這一answer你可以在index.php文件添加:

$loader = require 'vendor/autoload.php'; 
$loader->add('Namespace\\Somewhere\\Else\\', __DIR__); 
$loader->add('Namespace\\Somewhere\\Else2\\', '/var/www/html/xxx'); 
4

PSR-4需要加載的文件有一個命名空間類,並且名稱空間結構必須與目錄結構相匹配(相對於配置中定義的「基本目錄」(http://www.php-fig.org/psr/psr-4/))。

所以,在文件/var/xxx/ModuleA/baseObjects/configClass.inc應該是類

namespace ModuleA\baseObjects; 

class configClass { 
    ... 
} 

然後在var/www/laravel/composer.json你可以有

"psr-4": { 
     "App\\": "app/", 
     "ModuleA\\": "../ModuleA" 
    } 

這意味着:「目錄../ModuleA應該是根ModuleA命名空間,然後按照子命名通過匹配從那裏的子目錄「。

1

您遇到的問題與父目錄無關。實際上,您的Composer.json自動載入配置對於您的目錄結構是正確的。

問題是.inc文件擴展名,它與PSR-4規範不兼容。這裏更多的信息:How To Make Composer (PSR-4) To Work With ".class.php" Extension?

如果你不能更新你的源代碼相匹配的PSR-4規格的,你可以使用Class Mapping

的類映射引用都結合起來,在安裝/更新到一個單一key =>值數組可能在生成的文件vendor/composer/autoload_classmap.php中找到。該地圖通過掃描給定目錄/文件中的所有.php.inc文件中的類來構建。

您可以使用類映射生成支持爲所有不遵循PSR-0/4的庫定義自動加載。要配置它,可以指定所有目錄或文件來搜索類。

那麼你的配置可能類似於:

"autoload": { 
    "classmap": [ 
     "../ModuleA/baseObjects", 
     "../ModuleB/baseObjects" 
    ] 
} 

記住,如果你使用類映射,你需要運行composer dump-autoload你改變composer.json任何時候,添加一個類,修改類的名字/文件名/路徑等

額外:通過@alepeino指出的那樣,使用autoloader optimization將產生從任何PSR-0和PSR-4自動加載定義一類圖,使用相同的底層代碼classmap自動加載使用。這將「允許」您使用PSR-4自動加載器和.inc擴展。不過,每次更改文件時,這仍然需要您運行composer dump-autoload --optimize,就像classmap一樣。

最佳推薦:更改您的源代碼以遵循PSR-4規範,並使用.php擴展。

如果你不能這樣做,那麼下一個最好:使用classmap進行自動加載。

+0

我之所以這樣想,是因爲我嘗試了它,發現雖然PSR-4規範聲明文件擴展名「MUST」是「.php」,但作曲者實際上正確加載了「.inc」。 – alepeino

+0

我希望看到您使用的測試代碼進行測試。我做了一個與所討論的目錄結構匹配的基本PSR-4設置,然後將其中一個類擴展名改爲.inc,並且不能再找到它。 [自動加載器明確設置擴展名](https://github.com/composer/composer/blob/e42e1156d51ca5494b058b1a7b480bc703c4f57a/src/Composer/Autoload/ClassLoader.php#L351)。也許Composer版本有所不同? –

+0

事實證明,我在Laravel項目中完成了第一次測試,然後再次嘗試了一個新的臨時項目,並且無法正常工作。我的原始composer.json打開了'optimize-autoloader'。見https://github.com/alepeino/composer-optimize – alepeino

0

使用classmap autoload將解決此問題。

{ 
... 
"autoload": { 
     "classmap": ["ModuleA/", "ModuleB/"] 
    } 
} 

這可能與使用PSR-4

{ 
    ... 
    "autoload": { 
      "psr-4": { 
       "Acme\\": "src/Acme/" 
      }, 
      "classmap": ["ModuleA/", "ModuleB/"] 
     } 
    } 

編號:https://getcomposer.org/doc/04-schema.md#classmap