私は私のようなプロジェクト構造を持っています:
_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'),
);
_
上記のどこが間違っているのか誰かが指摘できますか?
まず、Linux(どのPCを使用しているかはわかりません)では大文字と小文字が区別されます。自動読み込みでsrc/bix
を定義しましたが、src/Bix
です。
ただし、さらに重要なことに、PSR-4では、指定された名前空間プレフィックスはnotがディレクトリ構造に含まれます(1つのディレクトリのみを含むディレクトリを避けるため)。あなたの場合、"Bix\\": "src/"
を設定する場合、クラスBix\Model\User
をsrc/Model/User.php
に配置する必要があります。
[〜#〜] edit [〜#〜]:誤解しているPHP名前空間。PHPでは、「Bix\Model
このファイルのグローバル名前空間に ""を付けてuse Bix\Model;
で置き換えます。代わりに、「このファイル内のModel
をBix\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();