#php #wordpress #laravel #composer-php #phpunit
#php #wordpress #laravel #композитор-php #phpunit
Вопрос:
Мне нужно загрузить WordPress wp-load.php перед vendor/autoload.php и Laravel.
Я могу обновить в public/index.php
, но на уровне PHPUnit vendor/bin/phpunit
загружается vendor/autoload.php
перед wp-load.php
.
Возможно ли заставить composer загружать файл перед чем-либо еще?
Я пытался
{
"autoload" : {
"files" : ["public/wordpress/wp-load.php"]
}
}
Но, похоже, это не работает, поскольку composer загружает Laravel перед WordPress…
Единственное уродливое исправление, которое я нашел, — вручную загрузить wp-load в vendor/autoload.php файл, но мне нужно делать это при каждом обновлении composer.
Ответ №1:
Composer не несет ответственности за загрузку autoload.php
, но любой фреймворк, который вы используете, является. PHPUnit, в вашем случае.
PHPUnit загружается только vendor/autoload.php
потому, что этот файл загрузился в phpunit.xml
конфигурации.
Гораздо проще, чем делать какие-либо странные инъекции во время запуска composer, это просто создать свой собственный файл начальной загрузки для тестирования.
Если вы проверите phpunit.xml
, вы найдете объявление bootstrap, которое по умолчанию загружается 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"
Это чище и более доступно в обслуживании, и дает правильный результат. Какие файлы загружаются / самонастраиваются перед выполнением, не является задачей composer.
Чтобы выполнить то же самое во время обычного запуска Laravel, вам нужно изменить файл точки входа Laravel, вы обнаружите, что там требуется автозагрузка:
/*
|--------------------------------------------------------------------------
| 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
or include
перед этим пунктом.
Например.:
require 'path/to/wordpress/wp-load.php';
require __DIR__.'/../vendor/autoload.php';
Использование files
ключа composer просто не будет работать. Эти файлы загружаются в vendor/composer/autoload_files.php
file, а этот, в свою очередь, загружается в vendor/composer/autoload_real.php::getLoader
, после выполнения остальной части настройки процесса автоматической загрузки.
Комментарии:
1. Привет @yivi, проблема в том, что я использую PHPUnit для модульного тестирования, и у него другая точка входа в загрузчик, чем Laravel … => На данный момент мне удалось взломать это с помощью скрипта обновления после composer для внедрения wp-load.php перед vendor/autoload.php
2. Хорошо, обновил мой ответ, чтобы учесть тот факт, что вам это нужно во время тестирования, хотя подход тот же. @injetkilo
Ответ №2:
Исправление, которое я нашел на данный момент, заключается в применении php-скрипта сразу после дампа автозагрузки composer (в скриптах после автоматической загрузки) => это делает свое дело.
Комментарии:
1. Можете ли вы объяснить это подробнее, чтобы другие могли извлечь уроки из вашего ответа?