如何在没有名称空间的情况下向TYPO3扩展添加PHP库?

时间:2019-05-02 09:19:57

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

我想实现一个自定义的TYPO3扩展来执行一些php代码。与我的主要班级“你好,世界!” ist已经在工作,我了解名称空间的使用。 但是现在我发现了一个适合我需求的php库。我将lib文件夹粘贴到了扩展程序的“ Classes”文件夹中。但是现在我遇到了找不到类的错误,因为所有的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',
);

但是当我尝试在主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";

    }
}

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

如果您正在运行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