All Posts
10 articles
How ZF1 Users Log Into Symfony With Cross-Framework Authentication
During a Strangler Fig migration, both frameworks need to recognize the same user. Here is how a Symfony authenticator read Zend_Auth session data to create seamless single sign-on across ZF1 and Symfony — and why it was the first bridge component to be removed.
Sharing One PostgreSQL Connection Between Two ORMs
During a Strangler Fig migration, both old and new ORMs must access the same data. Here is how one Symfony event subscriber made Zend_Db and Doctrine ORM share a single database connection — no ETL, no sync scripts, no duplication.
Running ZF1 Inside Symfony 8 With the Strangler Fig Pattern
The catch-all route that let two frameworks coexist in the same process. How Symfony booted Zend Framework 1 internally, shared the session, and returned a unified response — without a reverse proxy.
Why We Migrated from Zend Framework 1 to Symfony 8 in 2026
Zend Framework 1 has been end-of-life since 2016. PHP 5.6 receives no security patches. But the application still worked — so why take the risk? The decision process behind migrating a production HR platform from ZF1 to Symfony 8.
Anatomy of Indirect Prompt Injection Hidden in Plain Text
Twenty-two techniques, three delivery methods, and one structural weakness: AI assistants cannot distinguish instructions from data. Here is how attackers exploit that, and what works as a defense.
Clinejection: How a Prompt Injection Infected 4,000 Terminals
How a single GitHub issue turned an AI triage bot into an entry point for a supply chain attack, step by step.
Has Your Stack Noticed the QUERY Method Is Standard Now
RFC 10008 gives HTTP a safe, cacheable request with a body. I sent QUERY through Node, fetch, Next.js and PHP to see what actually accepts it — verbatim results included.
Rebasing Stacked Branches Without the Squash-Merge Pain
A dependent branch, a squashed parent, and the Git flag most developers never reach for until it saves them.
The Tenant You Suspended Is Still Running Jobs
A status field changed. A boolean next to it didn't. The HTTP layer enforced the difference — nothing else did.
The Doctrine Filter That Only Breaks on Sub-Requests
A tenant-scoping filter that works perfectly under load, in every test, on every page — until one template embeds another controller.