php - 不在命名空间中的类
问题描述
我正在尝试为 Contao 创建一个挂钩扩展。但是 Contao 似乎无法从处理钩子的命名空间加载我的类。这是我的文件结构:
我尝试更改名称并将“.php”添加到课程中,查找教程,但我找不到我做错了什么。我在这个主题上相当缺乏经验,所以我可能会遗漏一些明显的东西。
自动加载.php
ClassLoader::addNamespaces(array
(
'Memberlevels',
));
gister PSR-0 namespace
*/
if (class_exists('NamespaceClassLoader')) {
NamespaceClassLoader::add('Memberlevels', 'system/modules/memberlevels/classes');
}
if (class_exists('NamespaceClassLoader')) {
NamespaceClassLoader::addClassMap(array
(
'Memberlevels' => 'system/modules/memberlevels/classes/myClass.php'
));
}
/*
* Register the templates
*/
TemplateLoader::addFiles([
'cookiebar' => 'system/modules/memberlevels/templates',
]);
配置文件
$GLOBALS['TL_HOOKS']['outputBackendTemplate'][] = array('Memberlevels\myClass', 'myOutputBackendTemplate');
我收到错误消息:
试图从命名空间“Memberlevels”加载类“myClass”。您是否忘记了另一个名称空间的“使用”语句?
解决方案
您仍在使用旧的 Contao 3 加载类的方式。在 Contao 4 中,您应该使用 composer 的自动加载功能。composer.json
最新的 Contao 版本的默认设置已经包含用于src/
Contao 安装文件夹的自动加载指令:
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
使用它,这就是您以兼容 Contao 4.4 的方式创建和注册钩子的方式:
// src/EventListener/OutputBackendTemplateListener.php
namespace App\EventListener;
class OutputBackendTemplateListener
{
public function onOutputBackendTemplate(string $buffer, string $template): string
{
// Do something
return $buffer;
}
}
// app/Resources/contao/config/config.php
$GLOBALS['TL_HOOKS']['outputBackendTemplate'][] = [\App\EventListener\OutputBackendTemplateListener::class, 'onOutputBackendTemplate'];
从 Contao 4.8 开始,您还可以使用注解来注册挂钩,无需在app/Resources/contao/config/config.php
.
推荐阅读
- excel - 如何修复从 Access 内部关闭 Excel
- angular - 试图删除或更改默认标记的图标
在角度谷歌地图中 - vue.js - Vue 组件槽不被视为子槽吗?
- unix - 如何使用 C++ 程序将 shell 命令的输出重定向到文件
- c - 无法分配链接描述文件中定义的变量的地址
- laravel - 此集合实例上不存在属性 [子类别]
- c# - 在没有用户交互的情况下关闭 Windows 窗体中的消息框
- python - 如何在 Python 中打印另一个字典中的键和深度嵌套字典中的值
- javascript - 带有 React Hooks 的 HoC
- windows - 如何让 emacs 正确打印 pdf?