2014-12-24 16 views
7

Funkcja pomocnicza Laravel ma ochronę if (! function_exists('xx')).Kompozytor: Określ autoload_files wymagają zamówienia

Czy mogę określić kolejność autoload_files, i niech Kint.class.php wymagają przed helpers.php?

return array( 
    $vendorDir . '/laravel/framework/src/Illuminate/Support/helpers.php', 
    $vendorDir . '/raveren/kint/Kint.class.php', 
); 
+0

Znalazłeś rozwiązanie to? Mam ten sam problem ... –

+0

Jeszcze nie ........ –

Odpowiedz

0

Przetestowałem to na kilka sposobów, dodając moich pomocników w autoload jak dobrze i nadal laravel pomocników mamy załadowane pierwszy.

Tak więc, moim rozwiązaniem jest włączenie własnych funkcji pomocniczych przed automatycznym ładowaniem dostawcy.

Zrobiłem to w index.php pliku w folderze 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'; 

wewnątrz złożyć pomocnicy, można zdefiniować funkcje pomocnicze:

function camel_case($value) 
{ 
    return 'MY_OWN_CAMEL_CASE'; 
} 
0

To jest naprawdę nieprzyjemny problem. Złożyłem wniosek dotyczący funkcji kompozytora: https://github.com/composer/composer/issues/6768

Powinien istnieć sposób na określenie kolejności operacji automatycznego ładowania, aby można było załadować własne "pliki", zanim którakolwiek z klas zostanie "wymagać" lub "wymagać" -dev "sekcje; każde rozwiązanie, które wymaga od ciebie edycji paczki trzeciej strony wewnątrz dostawcy/jest w najlepszym wypadku hacky, ale obecnie nie sądzę, żeby istniały inne dobre alternatywy.

Najlepsze, co mogę wymyślić, to użyć skryptu do zmodyfikowania vendor/autoload.php, tak aby zawierał pliki z mocą, ZANIM zawarł jedną z klas autoload. Oto mój 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); 

Można uruchomić to ręcznie, czy można mieć kompozytor go uruchomić poprzez dodanie go do swoich skryptów composer.json:

{ 
// ... 
    "scripts": { 
    "post-autoload-dump": [ 
     "php modify_autoload.php" 
    ] 
    } 
// ... 
}