CakePHP 3.5:通过 Composer 安装后无法访问插件 类
CakePHP 3.5: Cannot access Plugin Classes after installing it via Composer
所以我有一个 CakePHP 3 项目,想要加载 FluentDOM,一个不是专门为 CakePHP 编写的 PHP 插件。
根据这两个软件文档,Composer 是必经之路。根据我的理解,我所要做的就是:
- 运行
composer require fluentdom/fluentdom
在 powershell 中
- 运行
composer require fluentdom/selectors-phpcss
在 powershell 中
或
- 在项目根目录的composer.json中添加以下内容:
"require": {
"fluentdom/fluentdom": "^7.0",
"fluentdom/selectors-phpcss": "^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();
因此,加载供应商包的整个操作路径仅为:
- 运行
composer require fluentdom/fluentdom
在 powershell 中
- 运行
composer require fluentdom/selectors-phpcss
在 powershell 中
- 立即将新的 classes 与
$document = new \FluentDOM\DOM\Document();
一起使用
不需要进一步的步骤。旁注:Composer 似乎在使用 composer require {vendor}/{package}
安装供应商文件后刷新自动加载配置,但如果没有,或者自动加载配置被早期实验搞砸了,composer dumpautoload
应该修复它。
所以我有一个 CakePHP 3 项目,想要加载 FluentDOM,一个不是专门为 CakePHP 编写的 PHP 插件。 根据这两个软件文档,Composer 是必经之路。根据我的理解,我所要做的就是:
- 运行
composer require fluentdom/fluentdom
在 powershell 中 - 运行
composer require fluentdom/selectors-phpcss
在 powershell 中
或
- 在项目根目录的composer.json中添加以下内容:
"require": {
"fluentdom/fluentdom": "^7.0",
"fluentdom/selectors-phpcss": "^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();
因此,加载供应商包的整个操作路径仅为:
- 运行
composer require fluentdom/fluentdom
在 powershell 中 - 运行
composer require fluentdom/selectors-phpcss
在 powershell 中 - 立即将新的 classes 与
$document = new \FluentDOM\DOM\Document();
一起使用
不需要进一步的步骤。旁注:Composer 似乎在使用 composer require {vendor}/{package}
安装供应商文件后刷新自动加载配置,但如果没有,或者自动加载配置被早期实验搞砸了,composer dumpautoload
应该修复它。