FirmaModul to cache modułów per firma (denormalizowany). Aby ten cache był zawsze aktualny, wprowadziliśmy Doctrine entity listener na FirmaSubskrypcja — postPersist/postUpdate/postRemove automatycznie wywołują FirmaModulSyncService::synchronizujFirme().
Listener ma silent try/catch — błąd sync nie blokuje zapisu subskrypcji. Plus komenda app:firma-modul:sync jako safety net jeśli sync się rozjedzie.