2017-07-07 12 views
6

現在、親ディレクトリからクラスにアクセスする必要があるLaravelプロジェクトに取り組んでいます。Composer autoload - 親ディレクトリのクラスをロードする

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

それを試してください:あなたはindex.phpファイルに追加することができ

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

それは動作しません、上記のコードは、現在のディレクトリでそれを検索しようとすると、私は親ディレクトリにアクセスしようとしています。 – dzerow

0

このanswerによると:

$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/)で定義された "ベースディレクトリ"に対して、ディレクトリ構造と一致しなければなりません。 「ディレクトリ../ModuleAは副名前空間に従った後、ModuleA名前空間のルートでなければなりません:

ので、ファイルに/var/xxx/ModuleA/baseObjects/configClass.incを意味し、あなたが

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

を持つことができvar/www/laravel/composer.jsonにクラス次に

namespace ModuleA\baseObjects; 

class configClass { 
    ... 
} 

する必要がありますそこからサブディレクトリを突き合わせることによって。

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を変更するたびに実行するクラスを追加し、クラスの名前を変更する必要があります、覚えておいてください/ファイル名/パス、等エクストラ

autoloader optimizationがと同じ基本コードを使用して、任意のPSR-0からクラスマップとPSR-4オートロード定義を生成する使用し、@alepeinoによって指摘されたよう自動ロードが使用されます。これにより、PSR-4オートローダと.inc拡張子を使用することが許可されます。ただし、ファイルを変更するたびにcomposer dump-autoload --optimizeを実行する必要がありますが、これはクラスマップと同じです。

推奨:PSR-4仕様に準拠するようにソースコードを変更し、.php拡張子を使用することをお勧めします。

あなたがそれを行うことができない場合は、次のようにします。classmapを自動読み込みに使用します。

+0

PSR-4仕様ではファイル拡張子が ".php"でなければならないとしていますが、実際には ".inc"が正しく読み込まれていることがわかりました。 – alepeino

+0

テスト用にテストしたコードを見たいと思います。問題のディレクトリ構造に合った基本PSR-4をセットアップして、クラス拡張の1つを.incに変更しました。これはもはや見つかりませんでした。 [オートローダーが明示的に拡張子を設定する](https://github.com/composer/composer/blob/e42e1156d51ca5494b058b1a7b480bc703c4f57a/src/Composer/Autoload/ClassLoader.php#L351)。おそらくComposerのバージョンの違いは? –

+0

私はLaravelプロジェクトで初めてのテストをした後、もう一度裸の新しいアドホックプロジェクトで試してみると、うまくいきませんでした。オリジナルのcomposer.jsonには「最適化オートローダー」がありました。 https://github.com/alepeino/composer-optimize – alepeino

0

クラスマップの自動ロードを使用すると、この問題が解決されます。

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

それはPSR-4

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

文献で使用することができますhttps://getcomposer.org/doc/04-schema.md#classmap

関連する問題