- PVSM.RU - https://www.pvsm.ru -
Привет! Сегодня хочу поделиться опытом создания универсальной системы для работы с пользовательским контентом, которая позволила нам избежать дублирования кода и создать масштабируемое решение.
При разработке образовательной платформы столкнулись с типичной задачей: нужно было добавить комментарии, рейтинги и счетчики просмотров для разных типов контента - статей и паттернов проектирования. Первое желание - скопировать код. Но мы пошли другим путем.
Вместо создания отдельных таблиц pattern_comments, post_comments и т.д., мы использовали полиморфные связи Laravel:
Schema::create('comments', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->morphs('commentable'); // magic happens here
$table->foreignId('user_id');
$table->text('content');
// ...
});
Создали трейты, которые можно подключить к любой модели:
trait HasComments
{
public function comments(): MorphMany
{
return $this->morphMany(Comment::class, 'commentable');
}
}
-70% дублированного кода
Единая точка для исправления багов
Легкое добавление новых типов контента
Вложенность комментариев: ограничили глубиной 3 уровня для лучшего UX
Оптимизация запросов: использовали eager loading для replies
Real-time обновления: добавили через websockets (отдельная история)
Для фронтенда создали универсальный компонент с поддержкой:
Оптимистичных обновлений
Бесконечной прокрутки
Редактирования на месте
const { comments, createComment, toggleLike } = useComments({
entityType: 'patterns',
entityId: patternId
});
Полиморфные связи - мощный инструмент для создания гибких систем. Да, есть overhead на начальном этапе, но выигрыш в долгосрочной перспективе огромный.
P.S. Кстати, если интересуетесь паттернами проектирования, у нас есть проект [1] с интерактивными примерами и визуализацией архитектурных решений. А в телеграм-канале [2] делимся опытом применения паттернов в реальных проектах и обсуждаем архитектурные решения.
Код из статьи использован в production на упомянутых ресурсах, так что все примеры боевые :)
Автор: GestSe
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/comments/423559
Ссылки в тексте:
[1] проект: https://arch-patterns.ru/
[2] телеграм-канале: https://t.me/patterns_ru
[3] Источник: https://habr.com/ru/articles/921672/?utm_source=habrahabr&utm_medium=rss&utm_campaign=921672
Нажмите здесь для печати.