Catching Risky Doctrine Migrations Before Production
Database migrations are one of those things that often look harmless during code review. A migration may contain only a few lines of SQL, the applic…
Tech news from the best sources
Database migrations are one of those things that often look harmless during code review. A migration may contain only a few lines of SQL, the applic…
У виджета было 92 теста и 100% построчного покрытия. Потом я открыл его в маленьком окне терминала, и шапка таблицы уехала за верхнюю границу экрана…
There is a concurrency problem in APIs that is easy to miss. Two clients read the same resource: Client A -> GET /documents/42 Client B -> GET…
Работая с PHP, испытываешь постоянную необходимость поддерживать документацию в актуальном состоянии. В последнее время PHP проекты&n…
I recently released a small open-source Symfony bundle called MaskedBundle . The reason for building it was quite simple: logs are useful, but somet…
A comment on my last article was better than the article. The subject was single-database multi-tenancy, and @to21as argued that the predicate shoul…
Single-database multi-tenancy is the cheapest kind: one schema, one connection, an organization_id column on every tenant-owned table. The whole des…
В JSON нет типа для файла - так как же загрузить файл через JSON-RPC? Разбираю, как это устроено в otezvikentiy/json-rpc-api 5.2: multipart как тран…
JSON has no representation for a file. Strings, numbers, arrays, objects - that is the whole list. So every JSON-RPC API eventually runs into the sa…
Upgrading a Symfony application to PHP 8.4 doesn't have to mean rewriting half the codebase. For applications that have been running in production f…
If you write PHP and work with Symfony every day, chances are you’ve already run PHPStan or Psalm, or at least heard of Rector. But let’s be honest:…
Я сшил разрозненные карты MMO в один бесшовный мир: игрок выходит из города в пустыню и не замечает, что под ним уже работает другой сервер. А всю р…
В августе 2023-го я писал здесь про свой бандл для JSON-RPC API на Symfony. С тех пор он дорос с 1.x до 5.1 и работает в нескольких продакшенах - от…
mailkite/symfony-mailer resolves a mailkite+api:// DSN into a first-party Symfony Mailer transport — which means Mautic, PrestaShop, Drupal, and any…
Половину контрактов моего игрового сервера нельзя записать ассертом: исход живёт в ответе живого процесса, в разметке страницы и в кадре игры. Я зап…
Над одной игрой работает команда: люди правят контент в браузере, ИИ — через тот же сервис, локально разворачивать ничего не нужно. Каждый ассет жив…
Shopify's app documentation has exactly one first-class path: Node, the official CLI, and a Remix template that wires authentication for you. Pick a…
Contract testing a Symfony API with OpenAPI takes four moving parts: the OpenAPI spec, a WebTestCase (or a plain Request / Response pair), one trait…
Мы добавили кэширование, чтобы ускорить работу бэкэнда. Затем кэширование нарушило авторизацию. Поначалу ситуация казалась безобидной. Сервису Symfo…
Именно так я думал, когда начинал разбираться в этой теме. Но, разобравшись, я с уверенностью могу сказать, что это реально, такая ид…
Обычно процесс разработки API выглядит так: мы пишем контроллер. Затем каким-то образом его документируем. После чего фронтер, опираясь на такую док…
For years, Symfony teams solved UI scaling one of two ways. Either you adopted a JavaScript build pipeline — Webpack Encore, Vite, npm scripts — and…
Переход к микросервисной архитектуре неизбежно поднимает вопрос эффективности межсервисного взаимодействия. В PHP традиционный стек на базе PHP-FPM…
Book: Decoupled PHP — Clean and Hexagonal Architecture for Applications That Outlive the Framework Also by me: Thinking in Go (2-book series) — Comp…
Book: Decoupled PHP — Clean and Hexagonal Architecture for Applications That Outlive the Framework Also by me: Thinking in Go (2-book series) — Comp…
Book: Decoupled PHP — Clean and Hexagonal Architecture for Applications That Outlive the Framework Also by me: Thinking in Go (2-book series) — Comp…
When you build an API, the first line of defense isn't your firewall or your database — it's the request itself. Every payload that hits your contro…
Why JavaScript Calendar Libraries Fail Here The go-to solution for a calendar has been a JavaScript widget: FullCalendar, Pikaday, flatpickr, or one…
Originally posted on https://symfonycasts.com/blog/honest-entities Your Doctrine entities are lying to you! For years, the standard way to build Doc…
A prototype web page displaying pure placeholder content When building early UI prototypes or shaping design systems in Symfony, placeholder content…