Так как вы используете Symfony, я думаю, что вам лучше всего было бы внедрить LDap
объект, используя инъекцию зависимостей фреймворка.Однако я не эксперт в Symfony.Итак, как простой взлом, я бы сделал это так:
private function connect($req)
{
$dn = $this->config->get('BindDN')[$req->domain];
$pass = $this->config->get('BindPass')[$req->domain];
$servers = $this->config->get('Servers')[$req->domain];
$encryption = $this->config->get('EncryptionType')[$req->domain];
if (false === $dn) {
$msgkey = 'ldapauth-attempt-bind-search';
$bind_with = [null, null];
} else {
$msgkey = 'ldapauth-attempt-bind-dn-search';
$bind_with = [$dn, $pass];
}
$message = new Message($msgkey, [
'dn' => "{$dn}@{$req->domain}",
]);
$this->logger->info($message->text());
foreach ($servers as $server) {
if (false === $server) {
continue;
}
$ldap = $this->createLDAPObject($server, $encryption);
// Attempt bind - on failure, throw an exception
try {
call_user_func_array([$ldap, 'bind'], $bind_with);
$this->server = $server;
$this->encryption = $encryption;
// log successful bind
$msgkey = 'ldapauth-bind-success';
$message = wfMessage($msgkey)->text();
$this->logger->info($message);
return $ldap;
} catch (SymException $e) {
if (false === $dn) {
$msgkey = 'ldapauth-no-bind-search';
} else {
$msgkey = 'ldapauth-no-bind-dn-search';
}
$message = new Message($msgkey, [
'dn' => "{$dn}@{$req->domain}",
]);
$message = $message->text();
$this->logger->info($message);
$this->logger->debug($e->getMessage());
}
}
}
/**
* @param $server
* @param $encryption
* @return mixed
*/
public function createLDAPObject($server, $encryption)
{
return Ldap::create('ext_ldap', [
'host' => $server,
'encryption' => $encryption
]);
}
Затем вы можете смоделировать метод-член createLDAPObject
вместо насмешки над статическим методом Ldap::create
, что должно быть проще.
Однако я бы порекомендовал вам провести рефакторинг вашего кода, чтобы он был более читабельным и тестируемым.
1 - Прежде всего, call_user_func_array()
не очень удобен для тестирования, и я думаю, что вашТребования здесь не слишком динамичны, поэтому вы можете заменить эту строку на $ldap->bind($bind_with[0],$bind_with[1]);
2 - Ваш метод connect
слишком велик для тестирования.Пожалуйста, прочитайте о Запахи кода - длинные методы
3 - Метод может быть реорганизован в меньшую версию путем отделения представления от логики.Например, вы получаете объект Message
для получения текста из $msgkey
просто для его регистрации, что не способствует удобочитаемости кода и способности к тестированию.
Это мои первые мысли овещь:)
Удачного кодирования и тестирования:)