【问题标题】:how to add a PHP library to TYPO3 extension without namespace?如何在没有命名空间的情况下将 PHP 库添加到 TYPO3 扩展?
【发布时间】:2019-05-02 09:19:56
【问题描述】:

我很想实现一个自定义的 TYPO3 扩展来执行一些 php 代码。与我的主要课程“你好世界!”它已经在工作,我了解名称空间的使用。 但是现在我找到了一个适合我需要的 php 库。我将 lib 文件夹粘贴到我的扩展程序的“类”文件夹中。但现在我收到类未找到错误,因为所有 lib 类都没有命名空间。

不幸的是,我找不到任何关于如何在为每个类动态添加命名空间的同时将库添加到typo3 扩展的教程/文档。我试图用命名空间覆盖每个类,但不知何故这不是解决方案

这是我的 Main 类的一个示例,它正在工作,但是当我尝试调用“ServiceMailman”时,我得到了命名空间错误,好吧,因为它们没有

namespace Htwg\GiMailman;

require_once 'Service/ServiceMailman.php';

class GiMailman{
    public function getMailinglists() {
        $mm = new ServiceMailman('http://localhost', '', '');
    }
}   

我正在寻找一种将 php 库添加到“Classes”文件夹的方法,而无需为每个库类添加命名空间。

更新: 我将库安装在外部路径上,并将其添加到 classmap 条目中的 composer.json:

"autoload": {
    "psr-4": {
        "Htwg\\GiMailman\\": "Classes/"
    },
    "classmap": ["/opt/lampp/lib/php/Services"]
}

它会显示在 autoload_classmap.php 中:

// autoload_classmap.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    ...
    'Services_Mailman' => $baseDir . '/../../../../lib/php/Services/Mailman.php',
    'Services_Mailman_Exception' => $baseDir . '/../../../../lib/php/Services/Mailman/Exception.php',
);

但是当我尝试在我的 Main php 类中对该类进行分类时,它仍然找不到:

namespace Htwg\GiMailman;

//require_once 'Services/Mailman.php';

class GiMailman{
    public function getMailinglists() {

        $mm = new \Service_Mailman('http://localhost:8001/3.1', '', 'password');

        return "getMailinglists";

    }
}

【问题讨论】:

  • 您在哪里配置了自动加载器以了解这个新库? Typo 不使用 Composer 之类的东西来处理此类问题吗?那个新库的命名空间是什么?
  • @NicoHaase 我在哪里可以配置自动加载器来添加这些类?我如何告诉 Composer 将此库添加到我的扩展中?库本身来自 pear.php.net
  • 我不知道那个扩展,你也没有提供它的名字,但是你应该寻找一个包含它的 Composer 包,或者将它安装为一个已安装的 PEAR 包,使用包管理器
  • 抱歉不清楚:这是我想在“类”文件夹中使用的库:github.com/pear/Services_Mailman 有没有办法用 composer 安装它?
  • 您确定要使用它吗?四年多以来,它仍处于测试阶段且无人维护

标签: php composer-php typo3 content-management-system autoload


【解决方案1】:

任何不使用命名空间的 PHP 类都在顶级命名空间中。所以你可以像这样使用它们:

$mm = new \ServiceMailman('http://localhost', '', '');

您不应该将外部库添加到您的Classes 目录。此目录中的类会自动加载正确的扩展名命名空间(供应商/扩展名)。由于外部库具有不同的名称空间,或者在您的情况下没有名称空间,这将导致问题。通常我们将外部库放在Resources/Private/Php/LibraryName 中。然后,您需要 require 或包含该库。

如果您使用 composer,最好不要在扩展中包含外部库,但如果可能的话,让 composer 担心它。这样您就不必担心自动加载(因此您不需要手动要求或包含任何文件)并且外部库的任何依赖项也会自动解决。在全局 composer.json 中需要该库,或者,如果您通过 composer 安装需要它的扩展,请将其添加到扩展的 composer.json。

【讨论】:

  • 使用这样的命名空间typo3仍然找不到类
  • 我已经编辑了我的答案以添加一些可能对您有所帮助的信息
【解决方案2】:

如果你正在运行composer,有两种方法:

  1. 该库在 https://packagist.org/ 上可用 => 在您的 composer.json 文件中需要它
  2. 需要将库复制到例如Library/ServiceMailman/。之后,如果此库不存在命名空间,则将其设置到自动加载部分“classmap”中的 composer.json 中。更多:https://getcomposer.org/doc/04-schema.md#classmap(如果库有命名空间,它应该在自动加载部分“psr-4”)

如果您没有运行 composer 并且想轻松地将其包含在您的 TYPO3 扩展中,有一个很好的教程:https://insight.helhum.io/post/148112375750/how-to-use-php-libraries-in-legacy-extensions

【讨论】:

  • 好的,所以我将 lib 的路径添加到 composer.json 中的“classmap”条目。使用 composer 更新时,我可以看到 autoload_classmap.php 中的所有路径。但是我现在如何在我的 php 脚本中调用该类?
  • 似乎还是找不到。我已更新我的问题以获取更多信息
猜你喜欢
  • 2019-02-22
  • 2014-09-18
  • 1970-01-01
  • 1970-01-01
  • 2014-12-07
  • 1970-01-01
  • 2011-02-18
  • 2019-08-03
  • 2011-08-01
相关资源
最近更新 更多