Как загрузить файл перед composer и /vendor/autoload.php ?

#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. Можете ли вы объяснить это подробнее, чтобы другие могли извлечь уроки из вашего ответа?