CakePHP 3.5:通过 Composer 安装后无法访问插件 类

CakePHP 3.5: Cannot access Plugin Classes after installing it via Composer

所以我有一个 CakePHP 3 项目,想要加载 FluentDOM,一个不是专门为 CakePHP 编写的 PHP 插件。 根据这两个软件文档,Composer 是必经之路。根据我的理解,我所要做的就是:

  1. 运行 composer require fluentdom/fluentdom 在 powershell 中
  2. 运行 composer require fluentdom/selectors-phpcss 在 powershell 中

  1. 在项目根目录的composer.json中添加以下内容:

"require": { "fluentdom/fluentdom": "^7.0", "fluentdom/selectors-phpcss": "^1.1" }

  1. 运行 composer update 在 powershell 中

这两种方式都会按预期将所需的插件安装到 vendor/fluentdom/{pluginname}/,但是 /vendor/cakephp-plugins.php 不会包括它们,正如 CakePHP's plugin installation manual.

所暗示的那样

以下尝试通过写入

在控制器中加载任一插件
use Cake\Core\Plugin;
Plugin::load('fluentdom/fluentdom');
Plugin::load('fluentdom/selectors-phpcss');

会导致在 plugins/ 中找不到所需插件的异常:

Make sure your plugin fluentdom/fluentdom is in the {absolute project path}\plugins\ directory and was loaded

-- 这已经很奇怪了,因为 Composer 一开始不会在那里安装任何东西。

我发现我可以通过手动扩展 vendor/cakephp-plugins.php 来包含正确的路径来解决这个问题:

'fluentdom/fluentdom' => $baseDir . '/vendor/fluentdom/fluentdom/',
'fluentdom/selectors-phpcss' => $baseDir . '/vendor/fluentdom/selectors-phpcss/'

(但是,这似乎不是可行的方法,因为此文件是自动生成的,并在每次更新后由 Composer 覆盖。)

即便如此,最后的问题仍然存在:尽管插件似乎已成功加载(由 运行ning Plugin::loaded()), I'd finally get the following exception when trying to access FluentDOM's classes as described in their wiki:

确认

$document = new FluentDOM\DOM\Document();

Class 'App\Controller\FluentDOM\DOM\Document' not found

插件是否错过了自动加载的执行?

甚至将我控制器中的线路延长至 Plugin::load('fluentdom/fluentdom', ['autoload' => true]);,但似乎也无济于事; according to CakePHP's doc,反正没必要。

那我错过了什么?

找到了!首先,我有一个错误的假设,即插件和供应商包或多或少是相同的:它们不是;感谢 Greg Schmidt 在问题的评论中指出这一点。

问题与我尝试访问 FluentDOM 的方式有关 class。而

$document = new FluentDOM\DOM\Document();

在独立的 php 文件中工作,它不在 Cake 项目中;我少了一个反斜杠:

$document = new \FluentDOM\DOM\Document();

因此,加载供应商包的整个操作路径仅为:

  1. 运行 composer require fluentdom/fluentdom 在 powershell 中
  2. 运行 composer require fluentdom/selectors-phpcss 在 powershell 中
  3. 立即将新的 classes 与 $document = new \FluentDOM\DOM\Document();
  4. 一起使用

不需要进一步的步骤。旁注:Composer 似乎在使用 composer require {vendor}/{package} 安装供应商文件后刷新自动加载配置,但如果没有,或者自动加载配置被早期实验搞砸了,composer dumpautoload 应该修复它。