Composer:指定autoload_files需要订单

时间:2014-12-24 12:41:13

标签: php laravel composer-php kint

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',
);

2 个答案:

答案 0 :(得分:1)

这是一个非常令人讨厌的问题。我提交了作曲家的功能请求:https://github.com/composer/composer/issues/6768

应该有一种方法来指定自动加载的操作顺序,以便可以在“require”或“require-dev”部分的任何类之前加载自定义“文件”;任何需要你在供应商内编辑第三方软件包的解决方案充其量只是hacky,但目前我认为还没有其他好的选择。

我能想到的最好的方法是使用脚本来修改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.json脚本来运行它:

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

答案 1 :(得分:0)

我通过几种方式对此进行了测试,通过在自动加载中添加我的助手以及我们首先加载的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';
 }