classy icon indicating copy to clipboard operation
classy copied to clipboard

ClassyUser

Open LehaMotovilov opened this issue 7 years ago • 2 comments

У нас небольшая проблема. Вот все варианты как можно использовать класс 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.

LehaMotovilov avatar Jul 08 '16 12:07 LehaMotovilov

Соглашусь, что в данном случае выкидывать исключение правильнее всего. Но удобнее бы было, если бы в случае, когда юзер не существует выдавать объект юзера с дефолтным контентом (Anonymous). Банальный пример, Messages System. Была переписка между юзером A и юзером B. Юзер B решил удалить свой профайл с сайта. В случае моего варианта - пользователь везде заменится на Anonymous, тогда как при Exception'е, это приведет к написанию дополнительного кода везде, где используется ClassyUser, который по сути будет делать тоже самое.

anrw avatar Jul 11 '16 15:07 anrw

Ну и во всех местах где модель 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.

LehaMotovilov avatar Jul 11 '16 21:07 LehaMotovilov