DigiSpace

Розробка на Symfony

Кастомна розробка на Symfony для складних бізнес-застосунків: модульна архітектура, API Platform, Doctrine, модернізація legacy.

Ілюстрація архітектури Symfony — доменні модулі, API та шина повідомлень

Symfony — наш вибір, коли проєкту потрібна enterprise-структура: чітка архітектура, передбачуваний шлях оновлень і компоненти, що чисто інтегруються з PHP-екосистемою. Ми беремо його для складних бекендів, API-first застосунків і доменів, занадто насичених для легшого фреймворку.

Де Symfony підходить найкраще

  • API-first бекенди — API Platform або власні REST/GraphQL-ендпоінти з явною серіалізацією та версіонуванням.
  • Складні бізнес-системи — інвойси, логістика, мультиорганізаційні платформи — де компоненти Form, Validator і Workflow окупають себе.
  • Довгоживучі кодові бази, де LTS-релізи Symfony й обіцянка зворотної сумісності важливіші за нові фічі.
  • Окремі компоненти — Console, HttpClient, Messenger та EventDispatcher чудово працюють і в не-Symfony проєктах.

Як виглядає запит

Життєвий цикл запиту Symfony з асинхронним транспортом Messenger

Все явно: роутинг, валідація й серіалізація — зона фреймворку; хендлер тримає доменну логіку. Асинхронна робота йде через Messenger у транспорт Doctrine або RabbitMQ.

Як ми структуруємо код

Застосунки організовані навколо домену, а не фреймворку: тонкі контролери, явні сервіси, чесні Doctrine-сутності, бізнес-логіка, що тестується без запуску ядра застосунку.

#[AsMessageHandler]
final class GenerateInvoiceHandler
{
    public function __construct(
        private InvoiceRepository $invoices,
        private PdfRenderer $pdf,
    ) {}

    public function __invoke(GenerateInvoice $command): void
    {
        $invoice = $this->invoices->get($command->invoiceId);
        $this->pdf->render($invoice);
        $invoice->markGenerated();
    }
}

Міграція та модернізація

Для legacy PHP — Zend, Symfony 2/3/4 або код без фреймворку — ми мігруємо інкрементально: старе й нове працюють поруч, модулі переносяться по одному, бізнес працює без зупинок. Поділіться вимогами — чесно скажемо, що підійде краще: Symfony, Laravel чи щось інше.