the_goldmayer
@the_goldmayer
Кот.

Как расширить проект на Laravel?

Добрый день!

Прошу вас посмотреть следующий код и раскритиковать :)

У нас есть в приложении как авторизованные, так и неавторизованные пользователи.
По большей части мы будем работать с таблицей contents и немного подписки пользователей.
Контент может быть как абсолютно бесплатным (доступным), так и платным. Если быть точнее, чтобы его получить, у пользователя должна быть подписка, и конечно же, когда он будет его запрашивать, он должен быть авторизован.

На фронтенде я использую React, и придумал locked.

locked - отвечает за то, будем ли мы отображать пользователю, что этот контент доступен или нет. Отображаем ему просто - в виде замка.

Модель Content

protected $hidden = ['secret'];

protected $appends = ['locked'];

public function getLockedAttribute()
{
    // Платный ли контент.
    if ($this->attributes['is_paid'] == true) {
      // Проверяем  авторизован ли пользователь или на наличие подписки
      if (! Auth::check() || Carbon::parse( Auth::user()->membership_ends_at ) < Carbon::now() {
          return $this->attributes['locked'] = true;
      }
    }

    // По умолчанию контент доступный.
    return $this->attributes['locked'] = false;
}


Также, по умолчанию мы ни в коем случае не спешим отправлять наш secret.
В контроллере следующий код.

foreach ($rootModel->contents as $content) {
   if (! $content->locked) {
       // Делаем видимым наш secret.
       $content->makeVisible('secret');
    }
}


Я хочу расширить свой проект. Мне жутко не нравится то, что происходит в getLockedAttribute().

Я хочу создать некий менеджер, который отвечает за подписки. Некий класс, который вернет нам значение в Bool, есть ли разрешения у пользователя (подписка) или нет. Да и разное другое. То что сейчас, по мне - грязный код и никак не DRY.

В документации ничего не понял или не нашел, скорее второй вариант. Что мне изучать и как вообще это делают?

Направьте, пожалуйста, как вам код, что бы вы изменили и как расширить приложение backend?

По поводу того, что мы в таблице пользователя храним значение о истечении срока подписки... На мой взгляд, всё отлично, так как это временные меры.

Благодарю!
  • Вопрос задан
  • 197 просмотров
Решения вопроса 1
@jazzus
Создать политику прикрепить к ресурсному контроллеру, в методе view политики прописать
return !$post->isPaid or optional($user)->hasSubscription;

Создать апи ресурс к постам, записать проверку политики Gate::allows('view', $this)
метод hasSubscription переписать
return $this->membership_ends_at >= now();
убрать из appends модели
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы