Пришлось сейчас подключить такую библиотеку к сайту через Composer. Проблема в том, что при любой ошибке в этой библиотеке, она роняет мне сайт примерно с такой стеной текста. Если скормить ей 127.0.0.1 или ip которого нет в базе или просто неправильный ip. Как я использую эту библиотеку. Composer у меня установлен в проект локально. PHP: require_once(ABSPATH.'/vendor/autoload.php'); use GeoIp2\Database\Reader; function get_body_classes() { $body_classes = ''; // default $reader = new Reader(ABSPATH.'/vendor/geoip2/share/GeoLite2-City.mmdb'); if ($reader) { if ($_SERVER['HTTP_X_REAL_IP']) { $ip = $_SERVER['HTTP_X_REAL_IP']; } else { $ip = $_SERVER['REMOTE_ADDR']; } $record = $reader->city($ip); if ($record) { $distr = $record->mostSpecificSubdivision->name; $city = $record->city->name; if (($distr != 'Moscow') and ($city != 'Moscow')) { $body_classes = 'not-moscow'; } } } return $body_classes; } Я копался в коде, смотрел как выводятся ошибки - там всё на неймспейсах, в которых я абсолютно не шарю. Сразу обозначу, что я тупой, чтобы ко мне не было притензий. Итак, вот как примерно выводятся ошибки в плагине: PHP: throw new AddressNotFoundException("The address $ipAddress is not in the database."); Если докапываться до сути, то все подобные вызовы стекаются к этому файлу: \vendor\geoip2\geoip2\src\Exception\GeoIp2Exception.php со следующим содержимым: PHP: <?php namespace GeoIp2\Exception; /** * This class represents a generic error. */ class GeoIp2Exception extends \Exception { } Я так понимаю, что сюда можно дописать свой кастомный вывод ошибки. Как мне это сделать? И как вообще игнорировать все ошибки, которые выводятся обращением к этому классу?
Строку где создается объект ридера можно в буфер кинуть, а после уже к примеру сохранять лог, если по скорому. А так, смотреть нужно этот объект и исправлять косяк Ну или где он там ругается
@gruth Это вот так что-ли? PHP: ob_start(); // do nasty shit $content=ob_get_contents(); ob_end_clean(); return $content;
@Nerfed, прочитай сначала про классы. Никакого отношения к composer это исключение не имеет. Любое брошенное исключение можно поймать и обработать, почитай ссылку от @romach. В библиотечные классы ничего дописывать не нужно.
@askanim Примерно такое, только текст ошибки другой. PHP: throw new AddressNotFoundException("The address $ipAddress is not in the database."); По итогу, оно всё приходит к PHP: class GeoIp2Exception extends \Exception Мне надо почитать то что @romach кинул, просто не успел пока. Вот это вообще для меня дичь пока. С классами всё понятно, ты можешь унаследовать класс и переопределить некоторые методы. Но как это в неймспейсах делается, я пока хз. Попробую разобраться вечером.
@romach @mkramer Я тут залил упрощённый пример. Кто-нибудь сможет за тыщу рэ сделать готовое решение с комментами? Нужен репетитор кароч, потому как я уже писал, что я тупой, и чтение того что скинул romach мне не помогло. Не понимаю я как пользоваться исключениями. Благо, в наше время можно купить знания напрямую. Через буфер кстати тоже не получилось, скрипт всё-равно падает. Да и буфер это костыль, а хочется постичь дзен и научиться делать правильно. Ещё хочется научиться не следить грязными ногами в библиотеках, которые подтягивает Composer, так что если эту задачу возможно сделать без правок в библиотеке, было бы вообще шикарно.
@Nerfed PHP: try { $record = $reader->city($ip); if ($record) { $distr = $record->mostSpecificSubdivision->name; $city = $record->city->name; if (($distr != 'Moscow') and ($city != 'Moscow')) { $body_classes = 'not-moscow'; } } } } catch (\Exception $e) { $body_classes = "default-body-class"; // Город по IP определить не смогли } Давай свою тыщу
PHP: <?php use GeoIp2\Database\Reader; error_reporting ( E_ALL ); ob_start(); require 'vendor/autoload.php'; // определение геолокации $result = 'Moscow'; $reader = new Reader( 'vendor/geoip2/share/GeoLite2-City.mmdb' ); $ip = '127.0.0.1'; # $_SERVER['REMOTE_ADDR']; try { $record = $reader -> city( $ip ); $distr = $record -> mostSpecificSubdivision -> name; $city = $record -> city -> name; if ( !in_array ( 'Moscow', [ $distr, $city ], true ) ) { $result = 'Not Moscow'; } } catch ( Throwable $e ) { $result = $e -> getMessage(); } echo $result; $contents = ob_get_contents (); ob_end_clean(); ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <?= $contents . PHP_EOL ?> <br> <br> <p style="color: red">Скрипт не упал.</p> </body> </html> --- Добавлено --- да е*аный в рот
Скинь карту и название банка в личку. Ещё будет шанс.)) Я ещё пол-любому буду тупить с неймспейсами и с фреймворками.