如何在 composer 和 /vendor/autoload.php 之前加载文件?

Posted

技术标签:

【中文标题】如何在 composer 和 /vendor/autoload.php 之前加载文件?【英文标题】:How to load a file before composer and /vendor/autoload.php? 【发布时间】:2019-08-13 05:43:22 【问题描述】:

我需要在 vendor/autoload.php 和 Laravel 之前加载 Wordpress wp-load.php。

我可以在 public/index.php 中更新,但在 PHPUnit 级别,vendor/bin/phpunitwp-load.php 之前加载 vendor/autoload.php

是否可以强制作曲家先加载文件?

我试过了


    "autoload" : 
         "files" : ["public/wordpress/wp-load.php"]
    

但它似乎不起作用,因为作曲家在 wordpress 之前加载 Laravel...

我发现的唯一丑陋的解决方法是在 vendor/autoload.php 文件中手动加载 wp-load,但我需要在每次 composer 更新时都这样做。

【问题讨论】:

【参考方案1】:

Composer 不负责加载autoload.php,但您使用的任何框架都是。 PHPUnit,在你的情况下。

PHPUnit 仅加载 vendor/autoload.php,因为该文件是在 phpunit.xml 配置中引导的。

比在 composer 运行期间进行任何奇怪的注入要容易得多,只需创建您自己的测试引导文件。

如果您检查phpunit.xml,您会发现默认加载vendor/autoload.php 的引导声明:

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="vendor/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
stopOnFailure="false">

创建一个新的引导文件(例如testing_bootstrap.php),除了vendor/autoload.php之外,还包括您需要的任何文件:

<?php
// testing_bootstrap.php

require 'path/to/wordpress/wp-load.php';
require 'vendor/autoload.php`;

并修改您的 phpunit.xml 文件,使其使用 文件来引导您的测试。

bootstrap="testing_bootstrap.php"

这样更简洁、更易于维护,并且实现了正确的结果。在执行之前加载/引导哪些文件不是作曲家的工作。


要在常规 Laravel 运行期间完成相同的操作,您需要修改 Laravel 的 entry point file,您会发现那里需要自动加载:

/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader for
| our application. We just need to utilize it! We'll simply require it
| into the script here so that we don't have to worry about manual
| loading any of our classes later on. It feels great to relax.
|
*/
require __DIR__.'/../vendor/autoload.php';

如果您想在自动加载之前加载不同的文件,只需在该点之前添加适当的requireinclude 语句。

例如:

require 'path/to/wordpress/wp-load.php';
require __DIR__.'/../vendor/autoload.php';

使用作曲家的files 键将根本不起作用。这些文件在vendor/composer/autoload_files.php 文件上加载,而这又在vendor/composer/autoload_real.php::getLoader 上加载,其余的自动加载过程设置已执行之后。


【讨论】:

嗨@yivi,问题是我使用PHPUnit 进行单元测试,它有一个不同于Laravel 的加载器入口点... => 目前我设法破解了它 - composer 更新脚本以在 vendor/autoload.php 之前注入 wp-load.php 好的,更新了我的答案,以说明您在测试期间需要这个,尽管方法是相同的。 @injetkilo【参考方案2】:

我目前找到的解决方法是在 composer 自动加载转储之后立即应用一个 php 脚本(在脚本 post-autoload-dump 中)=> 它可以解决问题。

【讨论】:

您能否进一步解释一下,以便其他人可以从您的回答中学习?

以上是关于如何在 composer 和 /vendor/autoload.php 之前加载文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Docker-Compose 中一起使用主机网络和任何其他用户定义的网络?

如何在 composer 和 /vendor/autoload.php 之前加载文件?

如何在 Jetpack Compose 的 LazyColumn/LazyRow 中禁用和启用滚动?

Composer:如何在没有网络连接的情况下添加依赖项?

如何在Ubuntu 20.04上安装Docker Compose

如何在Ubuntu 20.04上安装Docker Compose