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


Як впорядкувати складну бізнес-логіку без нескінченних if? Показую, як Laravel Pipeline зробив розрахунок комісії простішим і зрозумілішим.

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

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

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

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

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

Application layer ICanUp повинен лише відправити список public URLs, а не знати endpoint, API key, HTTP payload та Laravel Http facade. Показую, як IndexNowClientInterface став port, а IndexNowHttpClient адаптує цей простий contract до зовнішнього IndexNow API.