2016-02-12 184 views
0

我用Composer設置類的自動加載沒有任何問題,我已閱讀並觀看了數百萬的參考資料在這一點&不知何故,我似乎仍然錯過了一些至關重要的東西。作曲家自動加載和PHPUnit

一些快速的版本信息:

  • PHP - v5.6.17
  • 作曲家 - V1.0-DEV(alpha11,全球安裝)
  • PHPUnit的 - v4.2.6
  • 氣質 - 失意

項目佈局相對簡單:

. 
├── composer.json 
├── framework 
│   ├── classes 
│   │   ├── Test1.php 
│   ├── config 
│   │   ├── Test2.php 
│   ├── financial.html 
│   ├── form.html 
│   ├── index.php 
│   ├── models 
│   │   ├── Base.php 
│   ├── sample.html 
│   └── services 
│    └── validate.service.php 
├── phpunit.xml 
├── test 
│   └── FormTest.php 
└── vendor 
    ├── autoload.php 
    ├── composer 
    │   ├── autoload_classmap.php 
    │   ├── autoload_files.php 
    │   ├── autoload_namespaces.php 
    │   ├── autoload_psr4.php 
    │   ├── autoload_real.php 
    │   ├── ClassLoader.php 
    │   ├── installed.json 
    │   └── LICENSE 
    └── constants.php 

「composer.json」 目前包含以下內容:

{ 
    "name":    "testframework", 
    "require": { 
     "PHP":    ">=5.6.17" 
    }, 
    "autoload": { 
     "psr-4": { 
      "Config\\":  "framework/config/", 
      "Classes\\": "framework/classes/", 
      "Models\\":  "framework/models/" 
     }, 
     "files": [ 
      "vendor/constants.php" 
     ] 
    } 
} 

每當我修改的目錄結構,重命名類或修改 「composer.json」 我跑:

% composer validate (only when modifying "composer.json") 
% composer dump-autoload -o 

我打算從「框架」中的「類」,「配置」和「模型」文件夾自動加載所有類; 「index.php」目前實現了「framework/models/Base.php」,如下所示。

<?php 
    require_once(dirname(__DIR__) . '/vendor/autoload.php'); 

    use Models\Base; 

    $derp = new BaseModel(); 
?> 

我已經驗證了以上幾點,以正確的位置&回報: 「/var/www/testproject/vendor/autoload.php」

Base.php包含以下腳本:

<?php namespace Models; 

    class BaseModel { 
     public $submitAction = null; 

     protected $complete; 

     public function __construct() {} 

     /** 
     * Expose 
     *  Exposes the error code names for external processing. 
     * 
     * @return An array containing all error code names in this object. 
     */ 
     public static function Expose() { 
      $reflector = new ReflectionClass('ErrorCodes'); 

      return $reflector->getConstants(); 
     } 
    } 

我已經經歷了每個我可以想到的命名空間的變換,一直在無休止地修改「composer.json」,根據文檔添加和刪除段,純粹使用classmap(它沒有工作),測試「PSR-0」(也沒有工作),使用更大的錘子(也沒有工作)。

顯然我在做東西可怕的錯誤,我只是似乎無法解開什麼;任何人都可以看到我誤入歧途的地方嗎?

非常感謝, N00B

編輯:巨大的監督,在「供應商/作曲家」目錄包含以下有關作曲家的自動加載。

「autoload_classmap.php」:

<?php 

// autoload_classmap.php @generated by Composer 

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

return array(
    'Models\\BaseModel' => $baseDir . '/framework/models/Base.php', 
); 

「autoload_files.php」:

<?php 

// autoload_files.php @generated by Composer 

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

return array(
    'a9da57e70f975fe4a3c7dad63939dcd8' => $vendorDir . '/constants.php', 
); 

「autoload_psr4。PHP「:

<?php 

// autoload_psr4.php @generated by Composer 

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

return array(
    'Models\\' => array($baseDir . '/framework/models'), 
    'Config\\' => array($baseDir . '/framework/config'), 
    'Classes\\' => array($baseDir . '/framework/classes'), 
); 

我看到的錯誤是,從PHP:

Fatal error: Class 'BaseModel' not found in /var/www/testproject/framework/index.php on line 8

,並從PHPUnit的:

user% phpunit PHPUnit 4.2.6 by Sebastian Bergmann.

Configuration read from /var/www/testproject/phpunit.xml

PHP Fatal error: Class 'BaseModel' not found in /var/www/testproject/test/FormTest.php on line 6

回答

2

在你index.php你不輸入正確的等級:

use Models\Base; 

$derp = new BaseModel(); 

你應該導入Models\BaseModel類:

use Models\BaseModel; 

$derp = new BaseModel(); 

另外,文件名稱應與類名。 BaseModel類應該位於framework/models/BaseModel.php文件中,而不是framework/models/Base.php

請注意,您不需要在開發過程中優化自動裝載器(這是-o標誌正在執行的操作)。只在生產中使用它,否則每次添加新類時都必須轉儲自動加載器。

更多關於自動加載標準,可以在這裏閱讀:

+0

$ *?£&* +£&$%^ !!!!!謝謝,我知道這將會是一件非常愚蠢的事情。我發誓我已經試過這個了... 我知道關於-o標誌,聽說我不需要運行autodump命令,每次添加一個新類時都是新聞(如果標誌是省略)不過,所以再次感謝你,我會玩一玩。在過去的幾天中,我一直在通過php-fig.org進行搜索,有時你的手掌比無盡的文檔更有用。 –