PHP 未从应由 Composer 自动加载的库中找到 class
PHP doesn't find class from library that should be auto-loaded by Composer
PHP 似乎没有在我试图从 Composer 自动加载的库中找到定义的 class。
我正在使用 Apache 2.4 提供的 PHP,我过去曾成功使用它,但事实证明,将 Composer 引入其中对我来说很麻烦。我正在尝试使用 an OAuth2 library for Slack,在虚拟主机的文档根目录中使用 composer require bramdevries/oauth2-slack
成功安装,文件结构如下所示:
+-- composer.json
+-- composer.lock
+-- index.php
+-- vendor/
| +-- autoload.php
| +-- composer/
| +-- bramdevries/
| | +-- <library files>
| ... dependencies
这个库是迄今为止我唯一使用的库,我的 index.php
是整个文档根目录中唯一不是 composer/
中的库的源文件。就所有意图和目的而言,该项目大约有 3 行 PHP 代码,如下所示。
根据我对 the Composer documentation 的理解:因为我使用的库提供了自己的 composer.json
,如果我这样做,Composer 应该负责生成所有自动加载的东西 composer dump-autoload
(据我所知,这是不必要的,因为 Composer 在 update
、install
等上生成了这些东西)。
但是,每当我在浏览器中加载 index.php
时,Apache2 都会响应 HTTP 500。
鉴于上面的文件结构,这是我的全部 index.php
:
<?php
require "vendor/autoload.php";
$slack = new League\OAuth2\Client\Provider\Slack([ /* stuff */ ]);
?>
这是在 /var/log/apache2/error.log
中发现的错误:
PHP Fatal error: Uncaught Error: Class 'League\OAuth2\Client\Provider\Slack' not found in <document_root>/index.php:3
Stack trace:
#0 {main}
thrown in <document_root>/index.php on line 3
所以,我显然做错了什么,但是呢?
我已经使用 Apache2 和 PHP 一段时间了(包括本学期的预科 CS 项目 class),但我的工作知识 PHP 仅限于功能方面;我对它的 OOP 方面没有太多了解。此外,我熟悉类似于 Composer 的 dependency/package 管理器(具体来说,Node.js 的 NPM),但不熟悉 Composer 本身。 TIA!
编辑:忘记添加了——我搜索得够多了,任何给定 Google 搜索的前几页上的每个 link 与相关术语都显示为紫色,但我什么都没有到目前为止尝试对我有用,所以我确定我只是错过了一步或其他东西。
他们的示例似乎不正确,或者可能已更改并且他们忘记更新 README。
如果您查看 Slack 提供程序的源代码,它位于命名空间 Bramdevries\Oauth\Client\Provider
.
中
您只需要将构造函数更改为:
$slack = new Bramdevries\Oauth\Client\Provider\Slack([ /* stuff */ ]);
希望在那之后你不要 运行 做任何其他事情!
它使用了他们的 composer.json
确实引入的 League
代码,但是要使用这个特定的提供者,您必须在适当的命名空间中引用他们的代码。
另一个提示是查看他们在 composer.json 中的自动加载定义:
"autoload": {
"psr-4": {
"Bramdevries\Oauth\Client\": "src"
}
},
PHP 似乎没有在我试图从 Composer 自动加载的库中找到定义的 class。
我正在使用 Apache 2.4 提供的 PHP,我过去曾成功使用它,但事实证明,将 Composer 引入其中对我来说很麻烦。我正在尝试使用 an OAuth2 library for Slack,在虚拟主机的文档根目录中使用 composer require bramdevries/oauth2-slack
成功安装,文件结构如下所示:
+-- composer.json
+-- composer.lock
+-- index.php
+-- vendor/
| +-- autoload.php
| +-- composer/
| +-- bramdevries/
| | +-- <library files>
| ... dependencies
这个库是迄今为止我唯一使用的库,我的 index.php
是整个文档根目录中唯一不是 composer/
中的库的源文件。就所有意图和目的而言,该项目大约有 3 行 PHP 代码,如下所示。
根据我对 the Composer documentation 的理解:因为我使用的库提供了自己的 composer.json
,如果我这样做,Composer 应该负责生成所有自动加载的东西 composer dump-autoload
(据我所知,这是不必要的,因为 Composer 在 update
、install
等上生成了这些东西)。
但是,每当我在浏览器中加载 index.php
时,Apache2 都会响应 HTTP 500。
鉴于上面的文件结构,这是我的全部 index.php
:
<?php
require "vendor/autoload.php";
$slack = new League\OAuth2\Client\Provider\Slack([ /* stuff */ ]);
?>
这是在 /var/log/apache2/error.log
中发现的错误:
PHP Fatal error: Uncaught Error: Class 'League\OAuth2\Client\Provider\Slack' not found in <document_root>/index.php:3
Stack trace:
#0 {main}
thrown in <document_root>/index.php on line 3
所以,我显然做错了什么,但是呢?
我已经使用 Apache2 和 PHP 一段时间了(包括本学期的预科 CS 项目 class),但我的工作知识 PHP 仅限于功能方面;我对它的 OOP 方面没有太多了解。此外,我熟悉类似于 Composer 的 dependency/package 管理器(具体来说,Node.js 的 NPM),但不熟悉 Composer 本身。 TIA!
编辑:忘记添加了——我搜索得够多了,任何给定 Google 搜索的前几页上的每个 link 与相关术语都显示为紫色,但我什么都没有到目前为止尝试对我有用,所以我确定我只是错过了一步或其他东西。
他们的示例似乎不正确,或者可能已更改并且他们忘记更新 README。
如果您查看 Slack 提供程序的源代码,它位于命名空间 Bramdevries\Oauth\Client\Provider
.
您只需要将构造函数更改为:
$slack = new Bramdevries\Oauth\Client\Provider\Slack([ /* stuff */ ]);
希望在那之后你不要 运行 做任何其他事情!
它使用了他们的 composer.json
确实引入的 League
代码,但是要使用这个特定的提供者,您必须在适当的命名空间中引用他们的代码。
另一个提示是查看他们在 composer.json 中的自动加载定义:
"autoload": {
"psr-4": {
"Bramdevries\Oauth\Client\": "src"
}
},