Как добавить библиотеку PHP в расширение TYPO3 без пространства имен? - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь реализовать собственное расширение TYPO3 для выполнения некоторого php-кода. С моим основным классом "Привет, мир!" Это уже работает, и я понимаю использование пространств имен. Но теперь я нашел php-библиотеку, которая соответствует моим потребностям. Я вставил папку lib в папку «Classes» моего расширения. Но теперь я получаю ошибки: класс не найден, потому что ни один из классов lib не имеет пространства имен.

К сожалению, я не смог найти учебник / документ о том, как добавить библиотеку к расширению typo3 при динамическом добавлении пространства имен для каждого класса. Я пытался переопределить каждый класс с пространством имен, но каким-то образом это не может быть решением

вот пример моего основного класса, который работает, но как только я пытаюсь вызвать "ServiceMailman", я получаю ошибку пространства имен, ну, потому что у них его нет

namespace Htwg\GiMailman;

require_once 'Service/ServiceMailman.php';

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

Я ищу способ добавить библиотеку php в папку "Classes" без добавления пространства имен для каждого класса библиотеки.

Обновление: Я установил библиотеку по внешнему пути и добавил ее в composer.json в записи classmap:

"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 голосов
/ 02 мая 2019

Если вы работаете composer, есть два способа:

  1. Библиотека доступна на https://packagist.org/ => Требовать ее в файле composer.json
  2. Библиотека должна быть скопирована, например, в. Library/ServiceMailman/. После этого вы устанавливаете его в свой composer.json в разделе автозагрузки «classmap», если для этой библиотеки не существует пространств имен. Подробнее: 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

0 голосов
/ 02 мая 2019

Все классы PHP, которые не используют пространства имен, находятся в пространстве имен верхнего уровня. Таким образом, вы можете использовать их как:

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

Вы не должны добавлять внешние библиотеки в каталог Classes. Классы в этом каталоге автоматически загружаются с правильным пространством имен для вашего расширения (Vendor / ExtensionName). Поскольку внешние библиотеки имеют другое или, в вашем случае нет, пространство имен, это вызовет проблемы. Обычно мы помещаем внешние библиотеки в Resources/Private/Php/LibraryName. Затем вам нужно будет запросить или включить библиотеку.

Если вы используете composer, лучше не включать внешние библиотеки в ваше расширение, но позвольте композитору позаботиться об этом, если это возможно. Таким образом, вам не нужно беспокоиться об автозагрузке (поэтому вам не нужно запрашивать или включать какие-либо файлы вручную), и любые зависимости для внешней библиотеки также автоматически разрешаются. Либо требуется библиотека в вашем глобальном composer.json, либо, если вы устанавливаете расширение, которое требует его через composer, добавьте его в composer.json расширения.

...