避免在每个文件中要求使用vendor/autoload.php

3
我目前正在学习使用Composer和PSR-4在PHP中进行autoload。我已成功配置了我的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? - DigiLive
3
教训是,无论你做什么都像是一个hack...下次尝试使用单一入口点,并通过命名空间将逻辑自动加载到路由器中,而不是使用多个单独的文件。 - Lawrence Cherone
3个回答

3

通过在.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和文件路径来实现它。现在,我的另一个问题是:这样做安全吗? - Augusto Nuñez
@AugustoNuñez 你所说的“safe”是什么意思? - Nico Haase
1
我认为在文件前面或后面添加内容并不好,因为这会影响到每个脚本,即使它们没有要求供应商自动加载。 - Bimal Poudel
2
@BimalPoudel,我并没有说这个prepend功能是好的,但是OP的请求很明确,要求将某些内容添加到所有文件中而没有任何例外。 - Nico Haase

1

我认为最推荐的方法是有一个单一文件来加载所有其他文件,这些文件将根据当前操作加载所有其他文件。

因此,您需要一个类似于以下内容(显然非常简化)的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';
}

And you also have .htaccess file with mod rewrite enabled with such content:

RewriteEngine On

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

So now all traffic will go through index.php and you can require Composer autoloader only in this single file.


0

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

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

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

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

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

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

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


这如何帮助避免在每个脚本中使用 require_once - Nico Haase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接