Добрый день!
Прошу вас посмотреть следующий код и раскритиковать :)
У нас есть в приложении как авторизованные, так и неавторизованные пользователи.
По большей части мы будем работать с таблицей
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?
По поводу того, что мы в таблице пользователя храним значение о истечении срока подписки... На мой взгляд, всё отлично, так как это временные меры.
Благодарю!