2

次のファイル構造があります。

src/Models/Entity.php 
vendor/*
index.php
composer.*

Entity.php が含まれています

<?php
namespace Vendor\App\Models;

class Entity {}

index.php が含まれています

<?php
namespace Vendor\App;

require 'vendor/autoload.php';

use Vendor\App\Models\Entity;

$entity = new Entity();

composer.json には以下が含まれます。

{
    "autoload": {
        "psr-0": {"Vendor\\App\\": "src/"}
    }
}

vendor/composer/autoload_namespaces.php が含まれています

<?php

// autoload_namespaces.php generated by Composer

$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);

return array(
    'Vendor\\App\\' => $baseDir . '/src/',
);

そして、私は得る127.0.0.1:37409 [500]: / - Class 'Vendor\App\Models\Entity' not found in ...

エラーはどこですか?composer.json の複雑な名前空間および/またはソースディレクトリの形式は何ですか?

更新: 回避策 (src/Models を src/Vendor/App/Models に移動) が見つかりましたが、これは正常な動作ですか?

4

1 に答える 1

6

Composer/PSR-0 の自動読み込み規則はかなり混乱しています。新しい Packagist プロジェクトを作成するたびに、これを調べる必要があります。

composer.json ファイルを作成して autoload 情報を設定すると、次のようになります。

{
    "autoload": {
        "psr-0": { "Vendor\\App\\": "src/" }
    }
}

あなたが言っているのは、「で見つけることができる「Vendor\App」名前空間があるということproject_root/srcです。紛らわしい部分は、そのフォルダー(この場合は「src」)に割り当てるネストされた各名前空間が、その中に別のネストされたフォルダーがあります。

project_root/src/Vendor/Appそのため、この autoload スキームで検出されるようにクラスを配置する必要があります。

補足:App\Models\Type\Entityクラス名にアンダースコアを使用すると、アンダースコアもネストされたフォルダーを意味するため (つまり、を指す がsrc/App/Models/Type/Entity.phpと同じように表示されるため) 、これがどのように機能するかに問題が生じる可能性がありますApp/Models/Type_Entity.php。したがって、アンダースコアには注意してください。

于 2013-03-17T21:07:06.117 に答える