Вспомогательная функция Laravel имеет if ( ! function_exists('xx'))
защита.
Могу ли я указать порядок autoload_files
, и разреши Kint.class.php
требовать до helpers.php
?
return array(
$vendorDir . '/laravel/framework/src/Illuminate/Support/helpers.php',
$vendorDir . '/raveren/kint/Kint.class.php',
);
Это действительно неприятная проблема. Я подал запрос на добавление функции для композитора: https://github.com/composer/composer/issues/6768
Должен быть способ указать порядок операций автозагрузки, чтобы ваши пользовательские «файлы» могли быть загружены до любого из классов из разделов «require» или «require-dev»; любое решение, которое требует от вас редактирования стороннего пакета внутри вендора / в лучшем случае является хакерским, но в настоящее время я не думаю, что есть какие-либо другие хорошие альтернативы.
Лучшее, что я могу придумать, — это использовать скрипт для изменения vendor / autoload.php, чтобы он принудительно включал ваши файлы ДО того, как он включит любой из классов автозагрузки. Вот мой modify_autoload.php:
<?php
/**
* Updates the vendor/autoload.php so it manually includes any files specified in composer.json's files array.
* See https://github.com/composer/composer/issues/6768
*/
$composer = json_decode(file_get_contents('composer.json'));
$files = (property_exists($composer, 'files')) ? $composer->files : [];
if (!$files) {
print "No files specified -- nothing to do.\n";
exit;
}
$patch_string = '';
foreach ($files as $f) {
$patch_string .= "require_once __DIR__ . '/../{$f}';\n";
}
$patch_string .= "require_once __DIR__ . '/composer/autoload_real.php';";
// Read and re-write the vendor/autoload.php
$autoload = file_get_contents(__DIR__ . '/vendor/autoload.php');
$autoload = str_replace("require_once __DIR__ . '/composer/autoload_real.php';", $patch_string, $autoload);
file_put_contents(__DIR__ . '/vendor/autoload.php', $autoload);
Вы можете запустить это вручную или сделать так, чтобы composer запустил его, добавив его в ваши скрипты composer.json:
{
// ...
"scripts": {
"post-autoload-dump": [
"php modify_autoload.php"]
}
// ...
}
Я протестировал это несколькими способами, добавив своих помощников в автозагрузку, и все же помощники Laravel, которые мы загрузили первыми.
Поэтому мое решение состоит в том, чтобы включить собственные вспомогательные функции перед автозагрузкой поставщика.
Я сделал это в index.php
файл на public
папка
//my extra line
require_once __DIR__.'/../app/helpers.php';
//this is laravel original code
//I make sure to include before this line
require __DIR__.'/../vendor/autoload.php';
внутри вашего файла помощников вы можете определить свои вспомогательные функции:
function camel_case($value)
{
return 'MY_OWN_CAMEL_CASE';
}