Как включить вызывающую ООП библиотеку randomdotorg в codeigniter?

Класс находится здесь (с инструкциями).

Я добавил его в application/libraries/randomorg

Когда я добавляю $this->load->library('RandomOrg\Random'); в конструктор моего контроллера, я получаю следующую ошибку.

Сообщение: Класс 'RandomOrg\Client' не найден

Я пытался добавить различные файлы до этого (например, Client.php), но это не помогает.

Что происходит и как это исправить?


person desbest    schedule 24.03.2018    source источник
comment
Библиотеки с пространствами имен не могут быть загружены таким образом в CI. Вам нужно потребовать и автозагрузчик и использовать его для его загрузки.   -  person Alex    schedule 24.03.2018
comment
Я мало что знаю об ООП. Как загрузить библиотеку с пространством имен в Codeigniter?   -  person desbest    schedule 24.03.2018
comment
Я загрузил библиотеку с этим кодом. gist.github.com/JeyKeu/7533af3b9b5fd078910d Теперь, как мне использовать этот класс? Я не могу использовать $rand_org = RandomOrg\Random($this->config->item('randomorg_apikey'));, так как он не распознает RandomOrg/Random   -  person desbest    schedule 24.03.2018


Ответы (1)


Я знаю, что ответил на этот вопрос, прежде чем я просто не могу найти, где и не знаю, что искать. Итак, вот оно: Codeigniter может загружать только отдельные библиотеки php-файлов (за исключением драйверов, что является совершенно другим). Чтобы загрузить такую ​​библиотеку (с пространством имен), вы должны использовать что-то вроде: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md (пример класса).

Давайте назовем его Autoloader_psr4 и сохраним в библиотеках (измените объявление класса, чтобы оно соответствовало этому имени дословно (например, Autoloader_psr4). Удалите объявление пространства имен в классе, чтобы оно выглядело так: https://pastebin.com/NU8Rbp7Y

Давайте также переместим все файлы в src/randomorg/ просто в папку в third_party под названием RandomOrg, например. application/third_party/RandomOrg. Ваша папка должна выглядеть так, как показано здесь: https://github.com/defiant/randomorg/tree/master/src/randomorg

Применение:

$this->load->library('autoloader_psr4');
$this->autoloader_psr4->register();
$this->autoloader_psr4->addNamespace('RandomOrg', APPPATH . 'third_party/RandomOrg');
$random = new \RandomOrg\Client(); // or whatever...
person Alex    schedule 24.03.2018
comment
У меня проблемы с тем, чтобы заставить это работать. Внутри application/libraries/Autoloader_psr4.php, когда я комментирую namespace Autoloader_psr4;, веб-страница загружается, но когда я оставляю ее, я получаю эту ошибку Non-existent class: Autoloader_psr4 - person desbest; 24.03.2018
comment
Да, я забыл упомянуть об удалении объявления пространства имен. Вот версия, которую я использую: pastebin.com/NU8Rbp7Y ... Дайте мне знать, если у вас все еще есть проблемы с этим - person Alex; 24.03.2018
comment
Теперь, когда я запускаю $bw = $random_org->generateIntegers($this->config->item('randomorg_apikey'), 2, 0, 50); в своем php-контроллере, я получаю эту ошибку Message: require(C:\Users\User\Documents\UniServerZ\www\fresherplay\application\libraries/RandomOrg/RuntimeException.php): failed to open stream: No such file or directory - person desbest; 24.03.2018
comment
Где сейчас находятся ваши файлы src RandomOrg? - person Alex; 24.03.2018
comment
приложение / третья сторона - person desbest; 24.03.2018
comment
mkay, я просто не уверен, почему я вижу это в вашей ошибке: application\libraries/RandomOrg/RuntimeException.php можете ли вы разместить свое дерево папок на imgur? также дважды проверьте, используете ли вы APPPATH . 'third_party/RandomOrg' - person Alex; 24.03.2018
comment
Я изменил его на third_party, но все равно получаю ту же ошибку.Message: Class 'RandomOrg\RuntimeException' not found C:\Users\User\Documents\UniServerZ\www\fresherplay\application\third_party\RandomOrg\Client.php - person desbest; 24.03.2018
comment
Давайте продолжим обсуждение в чате. - person Alex; 24.03.2018
comment
Я исправил это, включив расширение mod_ssl и mod_curl для php. Также убедитесь, что все вызовы API указывают на https:// вместо http://. - person desbest; 05.09.2018