使用Composers自动加载器而不包含文件

时间:2016-09-13 13:01:33

标签: php composer-php autoload

我有一个遗留项目,它使用“autoload”定义中的“files”部分进行一些初始化。这种初始化取决于某些框架。我正在尝试做的是使这个代码库的少数单元测试可运行,而不需要框架。我的遗留项目的代码通过“autoload”中的“psr-4”和“classmap”的混合加载。此外,该项目依赖于通过Composer加载的许多库。

这意味着我不能像我通常那样在我的测试引导程序中包含composer autoloader(<script src="/Scripts/LAB.min.js"></script> <script> $LAB .script("/bundles/jquery?v=GnU3whLS74nHNYUsUJjcWJKdXvKBNbFqBrkQVKSNlKc1").wait() .script("/scripts/scripts/fileone.js").wait() .script("/scripts/scripts/filetwo.js").wait(function() { FunctionInFileTwo(); }); </script> )。我在vendor/autoload.php中只包含了classmap,namespace和psr-4加载器,但是在对Composer代码进行了一些挖掘之后发现它并不那么简单。

使用Composer生成的自动加载器是否有一种有点理智的方式,而不包含“autoload”部分中定义的“文件”?

1 个答案:

答案 0 :(得分:0)

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