所以我有一个CakePHP 3项目,想要加载FluentDOM,一个不是专门为CakePHP编写的PHP插件。 根据这两个软件文档,Composer是要走的路。在我的理解中,我所要做的就是:
- 在PowerShell中运行
composer require fluentdom/fluentdom
- 在PowerShell中运行
composer require fluentdom/selectors-phpcss
或
- 将以下内容添加到项目根目录中的 composer.json:
"require": {
"fluentdom/fluentdom": "^7.0",
"fluentdom/selectors-phpcss": "^1.1"
}
- 在PowerShell中运行
composer update
这两种方式都会按照预期将所需的插件安装到 vendor/fluentdom/{pluginname}/中,但/vendor/cakephp-plugins.php不会包含它们,正如 CakePHP 的插件安装手册所暗示的那样。
以下尝试通过编写在控制器中加载任一插件
use CakeCorePlugin;
Plugin::load('fluentdom/fluentdom');
Plugin::load('fluentdom/selectors-phpcss');
将导致在插件中找不到所需插件的异常/:
确保您的插件 fluentdom/fluentdom 位于 {绝对项目路径}\plugins\ 目录中并已加载
-这已经很奇怪了,因为Composer一开始就不会在那里安装任何东西。
我发现我可以通过手动扩展供应商/cakephp-plugins来解决这个问题.php以包含正确的路径:
'fluentdom/fluentdom' => $baseDir . '/vendor/fluentdom/fluentdom/',
'fluentdom/selectors-phpcss' => $baseDir . '/vendor/fluentdom/selectors-phpcss/'
(但是,这似乎不是要走的路,因为此文件在每次更新后都会自动生成并由 Composer 覆盖。
即便如此,最后一个问题仍然存在:尽管插件似乎已成功加载(通过运行Plugin::loaded()
确认),但在尝试访问 FluentDOM 的类时,我最终会得到以下异常,如他们的 wiki 中所述:
$document = new FluentDOMDOMDocument();
找不到类 'App\Controller\FluentDOM\DOM\Document'
插件是否错过了执行其自动加载的机会?
甚至将我的控制器中的行扩展到Plugin::load('fluentdom/fluentdom', ['autoload' => true]);
,但似乎也无济于事;根据 CakePHP 的文档,无论如何这都不是必需的。
那么我错过了什么?
找到了!首先,我有一个错误的假设,即插件和供应商包或多或少是相同的:它们不是;感谢格雷格施密特在问题的评论中指出这一点。
问题在于我如何尝试访问FluentDOM的课程。而
$document = new FluentDOMDOMDocument();
在独立的 php 文件中工作,它不在 Cake 项目中;我缺少一个反斜杠:
$document = new FluentDOMDOMDocument();
因此,加载供应商包的整个操作路径仅为:
- 在PowerShell中运行
composer require fluentdom/fluentdom
- 在PowerShell中运行
composer require fluentdom/selectors-phpcss
- 通过
$document = new FluentDOMDOMDocument();
立即使用新课程
无需进一步的步骤。旁注:Composer 似乎在使用composer require {vendor}/{package}
安装供应商文件后刷新自动加载配置,但如果没有,或者自动加载配置从早期的实验中搞砸了,composer dumpautoload
应该修复它。