web-dev-qa-db-ja.com

PSR-4オートローダーの致命的エラー:クラスが見つかりません

私は私のようなプロジェクト構造を持っています:

_src/
   ├─ Model/
      └─ User.php
_

私のUser.phpファイルは次のようになります。

_<?php
namespace Bix\Model;

class User {
_

そして私のcomposer.jsonオートローダーはこれです:

_"autoload": {
    "psr-4": {
      "Bix\\": "src/"
    }
  }
_

最後に私のbootstrap.phpはこれです:

_use Bix\Model\User;

// PSR-4 Autoloader.
require_once "vendor/autoload.php";
_

しかし、new User()を作成しようとすると、エラー_Fatal error: Class 'User' not found in /var/www/public/api/v1/index.php on line 8_が発生します

composer autoload_psr4.phpファイルを見ると問題ありません。

// autoload_psr4.php @ Composerによって生成されます

_$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname(dirname($vendorDir));

return array(
    'XdgBaseDir\\' => array($vendorDir . '/dnoegel/php-xdg-base-dir/src'),
    'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
    'KeenIO\\' => array($vendorDir . '/keen-io/keen-io/src'),
    'Bix\\' => array($baseDir . '/src'),
); 
_

上記のどこが間違っているのか誰かが指摘できますか?

12
JeremyKirkham

まず、Linux(どのPCを使用しているかはわかりません)では大文字と小文字が区別されます。自動読み込みでsrc/bixを定義しましたが、src/Bixです。

ただし、さらに重要なことに、PSR-4では、指定された名前空間プレフィックスはnotがディレクトリ構造に含まれます(1つのディレクトリのみを含むディレクトリを避けるため)。あなたの場合、"Bix\\": "src/"を設定する場合、クラスBix\Model\Usersrc/Model/User.phpに配置する必要があります。


[〜#〜] edit [〜#〜]:誤解しているPHP名前空間。PHPでは、「Bix\Modelこのファイルのグローバル名前空間に ""を付けてuse Bix\Model;で置き換えます。代わりに、「このファイル内のModelBix\Modelにエイリアス」します。

だからあなたはどちらかをするべきです:

require_once "vendor/autoload.php";

use Bix\Model;

$user = new Model\User();

または:

require_once "vendor/autoload.php";

use Bix\Model\User;

$user = new User();
22
Wouter J