Design Patterns у Laravel на реальному проєкті

Серія про design patterns на реальних кейсах ICanUp. Не енциклопедія патернів, а практичні задачі, де Pipeline, Observer, Registry, Strategy, Factory, Template Method та Adapter з’явилися як природне рішення конкретної архітектурної проблеми.

Design Patterns у Laravel на реальному проєкті
laravel-observer-content-block-search-text-cover.png
Ларавель

Laravel Observer на практиці: як я синхронізую search_text із ContentBlock.data

У ICanUp я додала до ContentBlock похідне поле search_text для пошуку. Головною проблемою стало не саме витягування тексту, а гарантія, що search_text завжди відповідає актуальному data незалежно від того, який сервіс, команда або інший код зберіг модель. Показую, чому для цього підійшов Observer на події saving, навіщо extraction logic залишилася в окремому класі і чому для старих даних усе одно потрібен backfill.

169
registry-pattern-laravel-content-blocks-without-giant-switch-cover.png
Ларавель

Registry Pattern у Laravel: як додавати Content Blocks без giant switch

У Page Builder ICanUp кількість контентних блоків поступово виросла від простих Paragraph і Image до Hero, Cards, FAQ, Forms, Model Collection та блоків з обмеженою областю використання. У статті я показую, як Registry Pattern дозволив об’єднати описи блоків навколо спільного контракту, знаходити потрібну реалізацію за типом і розширювати систему без одного великого `switch`.

160
strategy-pattern-laravel-search-multiple-search-types-without-switch-cover.png
Ларавель

Strategy Pattern у Laravel Search: різні типи пошуку без switch у сервісі

Публічний пошук у ICanUp працює з Posts, Categories, News і Tips, але кожен тип контенту має власні правила видимості, зв’язки, порядок сортування та поля для пошуку. У статті я показую, як `SearchProviderInterface` і окремі провайдери дозволили оформити ці різні алгоритми як взаємозамінні реалізації Strategy Pattern.

138
factory-pattern-laravel-choosing-right-conversation-resolver-thread-type-cover.png
Ларавель

Factory Pattern у Laravel: як ThreadType обирає правильний Conversation resolver

Communication Center у ICanUp підтримує Private, Group, Support, Feedback і Post Discussion threads, але кожен із цих типів створюється за власними правилами. У статті я показую, як `ThreadResolverFactory` вибирає потрібний resolver за `ThreadTypeEnum`, а `MessageService` при цьому залишається незалежним від конкретних реалізацій.

133
template-method-laravel-one-algorithm-different-content-blocks-cover.png
Ларавель

Template Method у Laravel: один алгоритм для різних Content Blocks

Hero, CTA, Highlight, Cards, Steps і FAQ працюють із різними даними, але мають спільну структуру початкових значень, валідації та налаштувань. У статті я показую, як `AbstractPresentationBlockDefinition` фіксує спільний алгоритм роботи, а конкретні описи блоків визначають лише власні точки розширення.

121