作曲家自动加载和PHPUnit


Composer Auto-loading & PHPUnit

我在使用 Composer 设置类自动加载时遇到了无尽的麻烦,此时我已经阅读并观看了数百万份参考资料,但不知何故,我似乎仍然缺少一些重要的东西。

一些快速版本信息:

  • 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:

致命错误:在 中找不到类"基本模型" /var/www/testproject/framework/index.php 在第 8 行

和来自 PHPUnit:

用户百分比 phpunit PHPUnit 4.2.6 由 Sebastian Bergmann 编写。

从/var/www/testproject/phpunit.xml 读取的配置

PHP 致命错误:在 中找不到类"基本模型" /var/www/testproject/test/FormTest.php 在第 6 行

在你的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 标志正在做的事情(。仅在生产中使用它,否则每次添加新类时都必须转储自动加载器。

有关自动加载标准的更多信息,请参阅此处:

  • http://www.php-fig.org/psr/psr-4/
  • http://www.php-fig.org/psr/psr-0/