2015-05-09 19 views
7

Tôi có cấu trúc dự án của tôi như vậy:PSR-4 autoloader Fatal error: Class không tìm thấy

src/ 
    ├─ Model/ 
     └─ User.php 

tập tin user.php của tôi trông như thế này:

<?php 
namespace Bix\Model; 

class User { 

Và composer.json autoloader của tôi là thế này:

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

Cuối cùng bootstrap.php của tôi là thế này:

use Bix\Model\User; 

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

Tuy nhiên nếu tôi cố gắng và tạo ra một new User(), tôi nhận được lỗi Fatal error: Class 'User' not found in /var/www/public/api/v1/index.php on line 8

Nhìn vào autoload_psr4.php soạn nộp có vẻ ok:

// autoload_psr4.php @generated bởi 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'), 
); 

Ai có thể chỉ ra nơi tôi đang làm sai với những điều trên?

Trả lời

14

Trước hết, Linux (Tôi không chắc chắn bạn sử dụng PC nào) phân biệt chữ hoa chữ thường. Trong quá trình tự động tải, bạn đã xác định src/bix, trong khi đó là src/Bix.

Nhưng quan trọng hơn, với PSR-4, tiền tố không gian tên được chỉ định là không được bao gồm trong cấu trúc thư mục (để tránh các thư mục chỉ chứa một thư mục). Trong trường hợp của bạn, nếu bạn định cấu hình "Bix\\": "src/", một lớp học Bix\Model\User phải được đặt tại src/Model/User.php.


EDIT: Bạn đang hiểu lầm không gian tên PHP. Trong PHP, bạn không nói "nhập mọi thứ từ Bix\Model vào không gian tên chung cho tệp này" với use Bix\Model;. Thay vào đó, điều đó có nghĩa là: "Bí danh Model trong tệp này là Bix\Model".

Vì vậy, bạn có nên làm:

require_once "vendor/autoload.php"; 

use Bix\Model; 

$user = new Model\User(); 

hay:

require_once "vendor/autoload.php"; 

use Bix\Model\User; 

$user = new User(); 
+0

tôi cập nhật các composer.json như thế này: "Bix \\": "src /" và cấu trúc thư mục này : src/Model/User.php tuy nhiên tôi vẫn gặp lỗi 'class User not found' – JeremyKirkham

+1

@JeremyKirkham sau khi bạn cập nhật cấu hình autoload, bạn phải chạy 'composer dump-autoload' để cập nhật autoloader –

+0

Tôi đã làm điều này rồi . Tôi đã cập nhật câu hỏi của mình với trình tự động tải thư mục/cấu trúc mới. – JeremyKirkham

Các vấn đề liên quan