【问题标题】:Using Composers autoloader without including files使用 Composers 自动加载器而不包含文件
【发布时间】:2017-01-21 02:22:40
【问题描述】:

我有一个遗留项目,它使用“自动加载”定义中的“文件”部分进行一些初始化。这个初始化依赖于一些框架。我要做的是让这个代码库的少数单元测试在没有框架存在的情况下可运行。我的遗留项目的代码是通过“自动加载”内的“psr-4”和“classmap”混合加载的。此外,这个项目依赖于许多通过 Composer 加载的库。

这意味着我不能像往常那样在我的测试引导程序中包含作曲家自动加载程序 (vendor/autoload.php)。我曾尝试在vendor/composer 中仅包含类映射、命名空间和 psr-4 加载器,但在对 Composer 代码进行一些挖掘后发现它并不那么简单。

有没有一种比较理智的方法来使用 Composer 生成的自动加载器,而不让它包含“自动加载”部分中定义的“文件”?

【问题讨论】:

  • 您可以简单地从vendor/composer/ 文件夹中加载autoload_classmap.php 吗?我的意思是,这可能会奏效。或者你需要的任何文件。
  • 没那么简单。这些文件实际上并没有加载任何东西,它们只是返回应该加载的规范。我当然可以使用 Composer 自动加载类注册它们,但我希望有更好的方法。
  • 遗留项目有什么好的方法吗?不要回答这个问题,反问。你可以注册一个 spl 自动加载器吗?至少它的好处是在需要它们之前不会实际加载类,但作曲家也是如此......

标签: php composer-php autoload


【解决方案1】:

一个可行但不是很好的解决方案是自己创建 Composer 自动加载器的实例并自己注册 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 自动加载器中的“静态初始化”代码路径。据我所知,这只是为了优化目的,所以这不应该是测试的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-13
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    相关资源
    最近更新 更多