Как правильно обращаться к классу из других классов?
Всем привет! Помогите понять, правильно ли я делаю аутентификацию и запросы к данным связанным с ней...
Пишу на сайте API для приложения и вот встал вопрос с аутентификацией (не путить с авторизацией).
Все запросы к API делаются через один файл (скажем index.php)
В этом файле создается объект класса Auth (Singleton) который проверяет token и получает данные (ID, Группу, Разрешения для этой группы и т.д.) о текущем пользователе из БД.
Дальше проверяется вызванный метод API и подключается необходимый файл (класс) через require_once.
И тут проблема. Например, мне нужно проверить может ли пользователь писать комментарии или посты и т.д.
И для этого мне нужно сделать проверку в методе $Auth->checkRole('add_comments') из класса AddComment
Для того, чтобы обращаться к классу Auth из другого класса, мне приходится в каждом классе, который обращается к классу Auth, в конструкторе, создавать свойство через метод $this->auth = $Auth::getInstance()
Ну а дальше понятно, в любом методе класса AddComment я просто обращаюсь к классу Auth через свойство $this->auth как к объекту класса.
Правильный ли это подход? Ведь мне нужно практически в каждом классе API обращаться к классу Auth, а значит и в каждый конструктор добавлять эту строку $this->auth = $Auth::getInstance()
Zhainar, Сделать так, чтобы каждый класс приложения наследовал либо этот родительский класс, либо класс, который наследует его и т.д.?
Вроде идея не плохая, но правильная ли...
В этом файле создается объект класса Auth (Singleton) который проверяет token и получает данные (ID, Группу, Разрешения для этой группы и т.д.) о текущем пользователе из БД
Для чего выполняется это действие? Разве тут вы не провряете права пользователя?
В конкретном примере вы правы, действительно проверка есть внутри подключившегося файла
Но при выводе ленты постов, мне нужно отдать клиенту (приложению) данные о том, что может делать с постом пользователь (удалять, изменять, комментировать).
В зависимости от этих данных в приложении показываются/непоказываются какие-то пункты меню.
Поэтому к классу Auth приходится обращаться из класса Feed, а там после получения постов из БД, во время прохождения циклом по каждому посту делать проверку вроде:
while($row = $res->fetch_assoc()){
// если пользователь является автором поста
if($row['author_id'] == $this->auth->getUserId()){
// проверяем может ли пользователь удалять свои посты
if($this->auth->checkRole("delete_my_post")){
$allowed['delete'] = 1;
}
}
}
Правильный ли это подход? Ведь мне нужно практически в каждом классе API обращаться к классу Auth, а значит и в каждый конструктор добавлять эту строку $this->auth = $Auth::getInstance()
Если хотите упороться и сделать все по SOLID, то да, правильно.
Если же хотите сделать просто и надежно, то можно типа: Yii::$app->user->can('add_comments')
Поясните пожалуйста, в чем минус подхода которым я делаю, с чем я столкнусь вдальнейшем...
И какой принцип работы вот этой записи? Yii::$app->user->can('add_comments')
Где хранятся данные в этом случае?
Алексей Коновалов,
я не спорю, что обращение к роли пользователя через запуск приложения Yii2 ужасна (при чем тут вообще Yii2? :)
я спорю с тем, что в конструкторе КАЖДОЙ сущности нужно прописывать зависимость от Auth со словами «так по SOLID»
Максим Федоров, Я тоже с этим спорю )) и понимаю что это не правильно и должен быть способ лучше.
Но я так и не понял как сделать лучше )) Не понятно, откуда берутся данные вот тут: Yii::$app->user->can('add_comments')
Boris Korobkov, Установил Yii, посмотрел как реализован класс Yii... Он сам пустой но наследует класс BaseYii.
Я правильно понимаю принцип работы?
Где-то в первых строчках моего главного файла, создаем объект класса Auth и записываем его в свойство user этого самого глобального класса Yii? Yii::$app->user = Auth::getInstance();
А после этого в каждом классе, где нужно вызвать объект Auth - обращаемся к Yii::$app->user, который автоматически подгружается?
Где-то в первых строчках моего главного файла, создаем объект класса Auth и записываем его в свойство user этого самого глобального класса Yii?
Только ради аутентификации Yii не надо ставить. Либо используйте любой ACL, либо пишите сами в каждом файле типа (быстро и просто, но не SOLID) Auth::getInstance()->checkRole('add_comments')