如何在 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/phpunit
在 wp-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';
如果您想在自动加载之前加载不同的文件,只需在该点之前添加适当的require
或include
语句。
例如:
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 中禁用和启用滚动?