私はこの問題で運のないネットを見回してきました。 composer.json
のこのコードで作曲家のオートロードを使用しています:
"autoload": {
"psr-0": {"AppName": "src/"}
}
しかし、ベンダーフォルダーよりも高いレベルで自動ロードする必要があります。
このようなことをしてもうまくいきません:
"autoload": {
"psr-0": {"AppName": "../src/"}
}
誰かが修正を知っていますか、これをどのように行うことができますか?
すべてのパッケージは、それ自体のオートロードを担当する必要があります。定義したパッケージ外のオートロードクラスで何を達成しようとしていますか?
アプリケーション自体の場合の回避策の1つは、ローダーインスタンスに次のような名前空間を追加することです。
<?php
$loader = require 'vendor/autoload.php';
$loader->add('AppName', __DIR__.'/../src/');
composer documentation は次のように述べています:
Autoloadフィールドを追加した後、インストールを再実行して、vendor/autoload.phpファイルを再生成する必要があります。
「src」ディレクトリが「vendor」ディレクトリと同じレベルにあると仮定します。
次の設定は完全に正しいです:
{
"autoload": {
"psr-0": {"AppName": "src/"}
}
}
ただし、動作させるために依存関係を再更新/インストールする必要があります。つまり、次を実行します。
php composer.phar update
このコマンドは、依存関係の最新バージョンを取得し、構成に一致するように「vendor/composer/autoload_namespaces.php」ファイルを更新します。
また、@ Domで述べたように、composer dump-autoload
を使用して、更新を行わなくてもオートローダーを更新できます。
composer autoload機能を使用する他の方法もあります。名前空間のないパッケージまたはカスタムの自動ロード機能を備えたパッケージをロードするのに役立つ方法。
たとえば、オートロード機能を含む単一のファイルを含める場合は、次のように「files」ディレクティブを使用できます。
"autoload": {
"psr-0": {
"": "src/",
"SymfonyStandard": "app/"
},
"files": ["vendor/wordnik/wordnik-php/wordnik/Swagger.php"]
},
そして、Swagger.php
ファイル内で次のようになりました:
function swagger_autoloader($className) {
$currentDir = dirname(__FILE__);
if (file_exists($currentDir . '/' . $className . '.php')) {
include $currentDir . '/' . $className . '.php';
} elseif (file_exists($currentDir . '/models/' . $className . '.php')) {
include $currentDir . '/models/' . $className . '.php';
}
}
spl_autoload_register('swagger_autoloader');
https://getcomposer.org/doc/04-schema.md#files
それ以外の場合は、クラスマップリファレンスを使用できます。
{
"autoload": {
"classmap": ["src/", "lib/", "Something.php"]
}
}
https://getcomposer.org/doc/04-schema.md#classmap
注:テスト中にcomposer dump-autoload
コマンドを忘れずに起動することを忘れないでください。
./composer.phar dump-autoload
ハッピーオートローディング=)
私の意見では、 Sergiy's answerは、与えられた質問に対して選択された答えでなければなりません。私は私の理解を共有しています。
以下に示すdir構造の下にあるcomposerを使用して、パッケージファイルを自動ロードしようとしていました。
<web-root>
|--------src/
| |--------App/
| |
| |--------Test/
|
|---------library/
|
|---------vendor/
| |
| |---------composer/
| | |---------autoload_psr4.php
| |
| |----------autoload.php
|
|-----------composer.json
|
psr-4 オートローディング仕様を使用しています。
プロジェクトのcomposer.jsonに以下の行を追加する必要がありました。クラスファイルをsrc/App、src/Testおよびライブラリディレクトリに配置する予定です。
"autoload": {
"psr-4": {
"OrgName\\AppType\\AppName\\": ["src/App", "src/Test", "library/"]
}
}
これはほとんど自明です。 OrgName\AppType\AppNameは、意図した名前空間プレフィックスです。例えばsrc/App/Controller/Provider/User.phpのクラスUserの場合-
namespace OrgName\AppType\AppName\Controller\Provider; // namespace declaration
use OrgName\AppType\AppName\Controller\Provider\User; // when using the class
また、「src/App」、「src/Test」は、composer.jsonが存在するWebルートからのものであることに注意してください。ベンダーのディレクトリとは関係ありません。 vendor/autoload.phpを見てください
composerが正しくインストールされている場合、必要なのは#composer update
composerの更新後、クラスが正常にロードされました。私が観察したのは、composerがvendor/composer/autoload_psr4.phpに行を追加していることです
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
'OrgName\\AppType\\AppName\\' => array($baseDir . '/src/App', $baseDir . '/src/Test', $baseDir . '/library'),
);
これがcomposerのマッピング方法です。 psr-0マッピングの場合、vendor/composer/autoload_classmap.phpにあります。
クラスを含むフォルダを指す名前空間のsrcフォルダにシンボリックリンクを作成するだけです...
ln -s ../src/AppName ./src/AppName
composerのオートロードは同じように見えます...
"autoload": {
"psr-0": {"AppName": "src/"}
}
AppName名前空間クラスは、現在の作業ディレクトリからsrc
フォルダ内のディレクトリを開始します...これで動作するはずです。
Autoload configは、ベンダーディレクトリの下で開始します。したがって、ベンダーのディレクトリを変更したい場合があります。
{
"config": {
"vendor-dir": "../vendor/"
},
"autoload": {
"psr-0": {"AppName": "src/"}
}
}
または、これはあなたのプロジェクトでは不可能ですか?