【问题标题】:Avoid to require vendor/autoload.php in every file避免在每个文件中都需要 vendor/autoload.php
【发布时间】:2018-05-25 11:01:09
【问题描述】:

我目前正在学习使用 composer 和 psr-4 在 php 中自动加载。我已经成功配置了我的 composer.json,我可以使用命名空间访问类。现在,问题是我必须在每个我想使用它的文件中包含 vendor/autoload.php。由于我的项目中的结构,它看起来像这样:

require("../../../vendor/autoload.php");

有没有更简洁的方法来做到这一点或避免在每个文件中都需要它?

我尝试了一些方法,例如使用该路由创建全局变量,但它不起作用。这是我尝试过的:

在我的 index.php 开头: $GLOBAL["autoloadPath"]= $_SERVER['DOCUMENT_ROOT'] . '/ipa-crm/vendor/autoload.php';

然后我在我需要的每个文件中添加了这个: require_once $GLOBAL["autoloadPath"];

提前致谢。

【问题讨论】:

  • 我假设您尝试过 $GLOBALS 而不是 $GLOBAL?
  • 经验教训,无论你做什么都将是一个黑客。下次有一个单一的入口点并使用命名空间通过路由器自动加载你的逻辑,而不是许多单独的文件。

标签: php composer-php autoload psr-4


【解决方案1】:

使用.htaccess 中的配置auto_prepend_file,您可以自动将PHP 文件添加到所有请求的PHP 文件中。只需将其放入您的.htaccess,如下所示:

php_value auto_prepend_file "/path/to/file/before.php"
php_value auto_append_file "/path/to/file/after.php"

【讨论】:

  • 谢谢!我试过了,它奏效了。但相反,我在我的 php.ini 文件中通过添加 auto_prepend_file 和文件路径来完成它。现在,我的另一个问题是:这样做安全吗?
  • @AugustoNuñez 你说的“安全”是什么意思?
  • 我觉得预先/附加文件不好,因为这会影响每个脚本,即使它们不需要供应商自动加载。
  • @BimalPoudel 我并没有说这个前置功能是一个好功能,但 OP 的请求显然是在 所有 文件中添加一些东西,没有任何例外
【解决方案2】:

我会说最推荐的方法是使用一个文件来加载所有其他文件,并且该文件将根据当前操作加载所有其他文件。

所以你有 index.php 文件,内容与此类似(这显然非常简化):

require __DIR__.'/../vendor/autoload.php';

switch ($_GET['url']) {
    case 'contact':
       require __DIR__.'/../pages/contact.php';
       break;
    case '':
       require __DIR__.'/../pages/main.php';
       break;
   default:
      require __DIR__.'/../pages/404.php';
}

您还拥有.htaccess 文件,该文件启用了具有此类内容的 mod 重写:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*)(.*)/?$ index.php?url=$1&%{QUERY_STRING}

所以现在所有流量都将通过index.php,您只能在这个文件中要求 Composer 自动加载器。

【讨论】:

    【解决方案3】:

    可能有几种不同的解决方案。最干净的方法是仅在配置文件中使用 require_once,在该文件中,每个项目都有自己的一组供应商文件夹。但是在 localhost 或允许重新配置 php.ini 的服务器上有一个高级选项:

    修改您的 php.ini 以附加一个指向 composer 全局路径的自定义路径。然后写:

    <?php
    require_once "vendor/autoload.php";
    

    确保您不使用本地供应商目录,或者只是确保您的作曲家已在本地定义了所有内容。我的意思是,本地 ./vendor 目录的存在是可选的。我的示例中缺少的 "./" 将允许 PHP 查找全局路径。然后,始终全局使用您的作曲家(在安装作曲家库时传递 global 作为附加参数。

    您的 php.ini 可能如下所示:

    include_path = "C:/Users/USER/AppData/Roaming/Composer"
    

    因此,vendor/autload.php 始终可用于任何 php 文件,如果它们调用 require_once "vendor/autoload.php"。希望您将在整个项目的配置文件中使用它一次,而不是在单个脚本中使用它。

    【讨论】:

    • 如何避免在每个脚本中使用require_once
    猜你喜欢
    • 2017-04-19
    • 2020-01-10
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    相关资源
    最近更新 更多