所以我有一个CakePHP 3项目并想加载FluentDOM,这是一个非专门为CakePHP编写的PHP插件。 根据这两份软件文档,Composer是最佳选择。根据我的理解,我所要做的就是以下几点:
composer require fluentdom/fluentdom
composer require fluentdom/selectors-phpcss
或
"require": {
"fluentdom/fluentdom": "^7.0",
"fluentdom/selectors-phpcss": "^1.1"
}
composer update
两种方式都会按预期方式将所需的插件安装到 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');
会导致在插件/ 中找不到所需插件的异常:
确保您的插件fluentdom / fluentdom位于{absolute project path} \ plugins \目录并已加载
- 这已经很奇了,因为Composer不会在那里安装任何东西。
我发现我可以通过手动扩展 vendor / cakephp-plugins.php 来包含正确的路径来解决这个问题:
'fluentdom/fluentdom' => $baseDir . '/vendor/fluentdom/fluentdom/',
'fluentdom/selectors-phpcss' => $baseDir . '/vendor/fluentdom/selectors-phpcss/'
(但是,这似乎不太合适,因为每次更新后都会自动生成并由Composer覆盖此文件。)
即便如此,最后一个问题仍然存在:尽管插件似乎已成功加载(通过运行Plugin::loaded()
确认),但在尝试访问FluentDOM的类{{3}时,我终于得到以下异常}:
$document = new FluentDOM\DOM\Document();
未找到类'App \ Controller \ FluentDOM \ DOM \ Document'
插件是否错过了自动加载?
甚至将我的控制器中的线延伸到Plugin::load('fluentdom/fluentdom', ['autoload' => true]);
,但似乎也没有帮助; as described in their wiki,无论如何都不需要。
那么我错过了什么?
答案 0 :(得分:0)
问题在于我如何尝试访问FluentDOM的课程。而
$document = new FluentDOM\DOM\Document();
在一个独立的php文件中工作,它没有在Cake项目中;我错过了一个反斜杠:
$document = new \FluentDOM\DOM\Document();
因此,加载供应商包的整个行动路径仅仅是:
composer require fluentdom/fluentdom
composer require fluentdom/selectors-phpcss
$document = new \FluentDOM\DOM\Document();
无需进一步的步骤。附注:在安装了composer require {vendor}/{package}
的供应商文件后,Composer似乎刷新了自动加载配置,但是如果它没有,或者自动加载配置与之前的实验相混淆,composer dumpautoload
应该修复它。