Composer 自动加载和 PHPUnit
Composer Auto-loading & PHPUnit
我在使用 Composer 设置 class 自动加载时遇到了无穷无尽的麻烦,此时我已经阅读并观看了数百万份参考资料,但不知何故我似乎仍然遗漏了一些重要的东西.
一些快速版本信息:
- PHP - v5.6.17
- Composer - v1.0-dev(alpha11,全球安装)
- PHP单元 - 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"
]
}
}
每当我更改目录结构时,重命名 classes 或修改 "composer.json" I 运行:
% composer validate (only when modifying "composer.json")
% composer dump-autoload -o
我的目标是从 "framework" 中的 "classes"、"config" 和 "models" 文件夹自动加载所有 class; "index.php" 当前实现 "framework/models/Base.php",如下所示。
<?php
require_once( dirname( __DIR__ ) . '/vendor/autoload.php' );
use Models\Base;
$derp = new BaseModel();
?>
我已确认以上指向正确的位置 & returns:“/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
编辑:巨大的疏忽,"vendor/composer" 目录包含以下与 Composer 的自动加载相关的内容。
"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
来自PHP单位:
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
在您的 index.php
中,您没有导入正确的 class:
use Models\Base;
$derp = new BaseModel();
您应该导入 Models\BaseModel
class:
use Models\BaseModel;
$derp = new BaseModel();
此外,文件名应与 class 名称匹配。 BaseModel
class 应该位于 framework/models/BaseModel.php
文件而不是 framework/models/Base.php
.
请注意,您不需要在开发期间优化自动加载器(这就是 -o 标志所做的)。仅在生产中使用它,否则每次添加新的 class.
时都必须转储自动加载器
可以在此处阅读有关自动加载标准的更多信息:
我在使用 Composer 设置 class 自动加载时遇到了无穷无尽的麻烦,此时我已经阅读并观看了数百万份参考资料,但不知何故我似乎仍然遗漏了一些重要的东西.
一些快速版本信息:
- PHP - v5.6.17
- Composer - v1.0-dev(alpha11,全球安装)
- PHP单元 - 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"
]
}
}
每当我更改目录结构时,重命名 classes 或修改 "composer.json" I 运行:
% composer validate (only when modifying "composer.json")
% composer dump-autoload -o
我的目标是从 "framework" 中的 "classes"、"config" 和 "models" 文件夹自动加载所有 class; "index.php" 当前实现 "framework/models/Base.php",如下所示。
<?php
require_once( dirname( __DIR__ ) . '/vendor/autoload.php' );
use Models\Base;
$derp = new BaseModel();
?>
我已确认以上指向正确的位置 & returns:“/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
编辑:巨大的疏忽,"vendor/composer" 目录包含以下与 Composer 的自动加载相关的内容。
"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
来自PHP单位:
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
在您的 index.php
中,您没有导入正确的 class:
use Models\Base;
$derp = new BaseModel();
您应该导入 Models\BaseModel
class:
use Models\BaseModel;
$derp = new BaseModel();
此外,文件名应与 class 名称匹配。 BaseModel
class 应该位于 framework/models/BaseModel.php
文件而不是 framework/models/Base.php
.
请注意,您不需要在开发期间优化自动加载器(这就是 -o 标志所做的)。仅在生产中使用它,否则每次添加新的 class.
时都必须转储自动加载器可以在此处阅读有关自动加载标准的更多信息: