Php 使用Composer autoloader而不包括文件
我有一个遗留项目,它使用“自动加载”定义中的“文件”部分进行一些初始化。此初始化取决于某个框架。我试图做的是在不存在框架的情况下使这个代码库的几个单元测试可以运行。我遗留项目的代码是通过“autoload”中的“psr-4”和“classmap”混合加载的。此外,该项目依赖于通过Composer加载的许多库 这意味着我不能像通常那样在测试引导程序中只包含composer autoloader(Php 使用Composer autoloader而不包括文件,php,composer-php,autoload,Php,Composer Php,Autoload,我有一个遗留项目,它使用“自动加载”定义中的“文件”部分进行一些初始化。此初始化取决于某个框架。我试图做的是在不存在框架的情况下使这个代码库的几个单元测试可以运行。我遗留项目的代码是通过“autoload”中的“psr-4”和“classmap”混合加载的。此外,该项目依赖于通过Composer加载的许多库 这意味着我不能像通常那样在测试引导程序中只包含composer autoloader(vendor/autoload.php)。我尝试过在vendor/composer中只包含类映射、名称空
vendor/autoload.php
)。我尝试过在vendor/composer
中只包含类映射、名称空间和psr-4加载器,不过在深入研究composer代码后发现这并不是那么简单
使用Composer生成的autoloader是否有某种合理的方法,而不让它包含“autoload”部分中定义的“文件”?一个可行但不是很好的解决方案是自己创建Composer autoloader的实例,并自己注册psr-4、classmap和psr-0定义 假设测试引导程序位于项目根目录的子目录中,则以下代码应该可以工作:
require __DIR__ . '/../vendor/composer/ClassLoader.php';
call_user_func( function() {
$loader = new \Composer\Autoload\ClassLoader();
foreach ( require __DIR__ . '/../vendor/composer/autoload_namespaces.php' as $namespace => $path ) {
$loader->set( $namespace, $path );
}
foreach ( require __DIR__ . '/../vendor/composer/autoload_psr4.php' as $namespace => $path ) {
$loader->setPsr4( $namespace, $path );
}
$classMap = require __DIR__ . '/../vendor/composer/autoload_classmap.php';
if ( $classMap ) {
$loader->addClassMap( $classMap );
}
$loader->register( true );
} );
这将永远不会使用来自Composer autoloader的“静态初始化”代码路径。据我所知,这只是出于优化目的,因此这对于测试来说不应该是一个问题。一个可行但不是很好的解决方案是自己创建Composer autoloader的实例,并自己注册psr-4、classmap和psr-0定义 假设测试引导程序位于项目根目录的子目录中,则以下代码应该可以工作:
require __DIR__ . '/../vendor/composer/ClassLoader.php';
call_user_func( function() {
$loader = new \Composer\Autoload\ClassLoader();
foreach ( require __DIR__ . '/../vendor/composer/autoload_namespaces.php' as $namespace => $path ) {
$loader->set( $namespace, $path );
}
foreach ( require __DIR__ . '/../vendor/composer/autoload_psr4.php' as $namespace => $path ) {
$loader->setPsr4( $namespace, $path );
}
$classMap = require __DIR__ . '/../vendor/composer/autoload_classmap.php';
if ( $classMap ) {
$loader->addClassMap( $classMap );
}
$loader->register( true );
} );
这将永远不会使用来自Composer autoloader的“静态初始化”代码路径。据我所知,这只是出于优化目的,因此这对于测试来说不应该是一个问题。您可以从
供应商/composer/
文件夹加载自动加载\u classmap.php
?我是说,我想这可能行得通。或者你需要的任何文件。没那么简单。这些文件实际上没有加载任何东西,它们只是返回应该加载的规范。我当然可以在Composer autoloading类中注册它们,不过我希望有一种更好的方法。对于遗留项目有没有更好的方法?不要回答这个问题,反问句。你可以注册一个spl自动加载器吗?至少它的好处是在需要类之前不实际加载它们,但是composer也一样……您可以从vendor/composer/
文件夹中加载autoload\u classmap.php
?我是说,我想这可能行得通。或者你需要的任何文件。没那么简单。这些文件实际上没有加载任何东西,它们只是返回应该加载的规范。我当然可以在Composer autoloading类中注册它们,不过我希望有一种更好的方法。对于遗留项目有没有更好的方法?不要回答这个问题,反问句。你可以注册一个spl自动加载器吗?至少它的好处是在需要类之前不实际加载它们,但是composer也一样。。。