classy
classy copied to clipboard
ClassyUser
У нас небольшая проблема. Вот все варианты как можно использовать класс ClassyUser.
$user = new ClassyUser( 1 ); // User by ID - Ok.
$user_2 = new ClassyUser(); // Must be current user?
$user_3 = new ClassyUser( 234 ); // User not exist.
Первый вариант в принципе понятен. Но с вторым и третим вариантами есть проблема. Во втором случае если пользователь не залогинен мы получаем пустой обьект ClassyUser так же как и в третьем варианте если юзера с таким ID не существует.
object(ClassyUser)[469]
public 'ID' => int 234
public 'link' => null
public 'user_login' => null
public 'name' => string 'Anonymous' (length=9)
public 'user_nicename' => null
public 'user_email' => null
public 'display_name' => null
private 'object' => boolean false
Получается что конструктор класа ClassyUser должен кидать Exception что юзер не найден. Что не сильно удобно так как все варианты использования класа нужно будет оборачивать в try catch.
Соглашусь, что в данном случае выкидывать исключение правильнее всего. Но удобнее бы было, если бы в случае, когда юзер не существует выдавать объект юзера с дефолтным контентом (Anonymous). Банальный пример, Messages System. Была переписка между юзером A и юзером B. Юзер B решил удалить свой профайл с сайта. В случае моего варианта - пользователь везде заменится на Anonymous, тогда как при Exception'е, это приведет к написанию дополнительного кода везде, где используется ClassyUser, который по сути будет делать тоже самое.
Ну и во всех местах где модель ClassyUser
используется не только для показа имени - нужно будет проверять это настроящий User или Anonymous. Получается все равно не совсем удобно. И вопрос с текущим юзером все равно остается открытым. Когда нужно его возвращать а когда Anonymous?
Если тебе все равно хочется иметь Anonymous юзера, то можно сделать например фабрику юзеров. Например:
Есть какой-то ClassyUserManager
который умеет создавать
ClassyAnonymousUser
ClassyUser
При этом все обьекты созданные ClassyUserManager
должны реализовывать какой-то ClassyUserInterface
, и все имеют стандарные методы по типу get_name, get_email, get_display_name, etc.
И при этом у этого ClassyUserManager
есть все методы для get_user_by_id, get_current_user, get_anonymous_user, is_user_exists, etc.