Не удается поймать исключение Ldap_add

#php #symfony #ldap

#php #symfony #ldap

Вопрос:

Я впервые использую LDAP вместе с PHP / symfony: я успешно подключаюсь к серверу LDAP и могу выполнять поиск и добавлять пользователей / группы, большой проблемы нет. Однако, когда я пытаюсь добавить пользователя, который уже существует, я получаю следующее предупреждение:

Внутренняя ошибка сервера HTTP 500

Предупреждение: ldap_add(): Добавить: уже существует

Я хотел бы перехватить его, поскольку оно выдает исключение и может быть заменено простым сообщением «Сбой: CN уже используется» для пользователя.

Однако я не могу найти способ сделать это и не понимаю, почему symfony выдает такое исключение, где ldap_add должен возвращать «false» только при сбое. (Оно действительно возвращает true при успешном выполнении): руководство по ldap_add

РЕДАКТИРОВАТЬ: Вот инкриминируемый код. Параметры в порядке, запрос выполняется успешно, когда я создаю нового пользователя.

Я попробовал несколько методов, чтобы перехватить ошибку, но, похоже, невозможно перехватить предупреждение

     try {
    $result = ldap_add($ldapconn, $userdn, $user);
    } catch(Throwable  $e) {
    echo $e->getMessage();
}
  

Комментарии:

1. Можете ли вы показать нам свой код?

2. Конечно, оно обновлено

Ответ №1:

По умолчанию Symfony преобразует предупреждение в исключения… Только в среде разработки

Это разумный выбор, который позволяет избежать сбоя вашей рабочей среды в случае возникновения непредвиденного поведения в рабочей среде.

В случае ошибки, функция ldap_add вернет false. Это то, что вы должны проверить. Возможно, вы захотите полностью отключить предупреждение, вы можете сделать это с помощью @ldap_add вместо этого.

Тем не менее, здесь есть 2 альтернативы.

  1. Возможно, вы захотите использовать безопасную библиотеку PHP, она преобразует предупреждения в исключения. Вот пример: https://github.com/thecodingmachine/safe
  2. Вы также можете временно настроить свой собственный прослушиватель ошибок, который будет выдавать исключение, на самом деле иногда Symfony делает это в своей собственной кодовой базе. И вот пример: https://github.com/symfony/symfony/blob/27d84dbe57ce65203b26232b87e6660fdba2f30e/src/Symfony/Component/String/AbstractString.php#L509 Самое главное — не избегать восстановления исходного обработчика ошибок.

Надеюсь, я помог!