Composer: Specify autoload_files require order
Asked Answered
B

2

10

Laravel's helper function has if ( ! function_exists('xx')) protection.

Can I specify order of the autoload_files, and let Kint.class.php require before helpers.php?

return array( 
    $vendorDir . '/laravel/framework/src/Illuminate/Support/helpers.php',
    $vendorDir . '/raveren/kint/Kint.class.php',
);
Backlash answered 24/12, 2014 at 12:41 Comment(1)
Did you find a solution to this? I'm facing the same problem...Brenda
K
6

This is a really obnoxious problem. I filed a feature request for composer: https://github.com/composer/composer/issues/6768

There should be a way to specify the order of operations of the autoloading so that your custom "files" can be loaded before any of the classes from the "require" or "require-dev" sections; any solution that requires you to edit a 3rd party package inside of vendor/ is hacky at best, but at present, I don't think there are any other good alternatives.

The best I could come up with is to use a script to modify the vendor/autoload.php so that it forcefully includes your files BEFORE it includes any of the autoload classes. Here's my 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);

You can run this manually, or you can have composer run it by adding it to your composer.json scripts:

{
 // ... 
  "scripts": {
    "post-autoload-dump": [
      "php modify_autoload.php"
    ]
  }
 // ...
}
Koball answered 27/10, 2017 at 15:17 Comment(1)
This is the best looking solution although still hacky...better than doing it in index.phpHernardo
R
3

I tested this in several ways, by adding my helpers in autoload as well and still Laravel helpers we loaded first.

So my solution is to include your own helper functions before the vendor autoload.

I did it in index.php file on the public folder

//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';

inside your helpers file, you can define your helper functions:

 function camel_case($value)
 {
     return 'MY_OWN_CAMEL_CASE';
 }
Rosemaryrosemond answered 8/10, 2017 at 7:58 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.