Bicycle/Services/Auth.php
Egor Isaev bbeb36b2e8 dev
2026-08-06 16:52:19 +03:00

63 lines
2.3 KiB
PHP

<?php
/**
* @package Bicycle
* @author Egor Isaev
* @description Auth.php
* @copyright (c) 06/08/2026
*/
namespace Services;
use Services\Auth\AuthDriver;
use Services\Auth\FileAuthDriver;
use System\Classes\Config;
use System\Classes\MyException;
/**
* Точка входа в авторизацию. Драйвер по умолчанию — Config::get('auth', 'driver')
* (по умолчанию 'file'); конкретный контроллер может запросить другой явно
* (Auth::instance('ldap') и т.п., когда такой драйвер появится) — без
* изменения остального кода.
*
* Auth::instance()->login($login, $password);
* Auth::instance()->loggedIn();
* Auth::instance()->getUser();
* Auth::instance()->logout();
*/
class Auth
{
/** @var array<string,class-string<AuthDriver>> Реализации по имени драйвера */
protected static array $_drivers = [
'file' => FileAuthDriver::class,
// 'db' => \Services\Auth\DbAuthDriver::class, // позже
// 'ldap' => \Services\Auth\LdapAuthDriver::class, // позже
// 'keycloak' => \Services\Auth\KeycloakAuthDriver::class, // позже
];
/** @var array<string,AuthDriver> Кэш созданных драйверов по имени */
protected static array $_instances = [];
/**
* Возвращает драйвер авторизации по имени (кэшируется).
*
* @param string|null $name Имя драйвера; null — значение по умолчанию из конфига
* @return AuthDriver
* @throws MyException Если драйвер не зарегистрирован
*/
public static function instance(?string $name = null): AuthDriver
{
$name ??= Config::get('auth', 'driver') ?? 'file';
if (!isset(self::$_instances[$name])) {
if (!isset(self::$_drivers[$name])) {
throw new MyException('Неизвестный драйвер авторизации: :name', [':name' => $name]);
}
$class = self::$_drivers[$name];
self::$_instances[$name] = new $class();
}
return self::$_instances[$name];
}
}