首页 > 解决方案 > 不在命名空间中的类

问题描述

我正在尝试为 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”。您是否忘记了另一个名称空间的“使用”语句?

标签: phpcontao

解决方案


您仍在使用旧的 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.


推荐阅读