Skip to content

2026

The Myth of the Micro-Framework

"Micro-framework" gets sold as simplicity. Pick a router, handle requests, stay out of your way. The reality is different: micro doesn't mean simple, it means incomplete by design. The decisions the framework skips become your decisions - and in a project that grows, those decisions accumulate.

Config Files Are Just PHP Arrays

Open a Symfony project and the routes are in YAML. The services are in YAML. The bundles are in PHP, but only as an array of class names. Open a Laravel project and routing lives in PHP, but services hide behind ServiceProviders that wrap bindings inside register() and boot() methods. Both approaches put a layer between you and the configuration, and that layer is where every typo, missing key, and "where is this interface bound" question accumulates.

Middleware Is Not a Layer

A controller reaches into middleware to run business logic. It looks convenient. The middleware has the session, the user, the request body, everything you need. So why bounce through a handler when you can just validate the cart right there? Because the moment you do, your business rule only runs inside an HTTP pipeline, and you just lost the ability to invoke it from anywhere else.

One Specification, Two Targets

Mocking a repository in tests does not verify your query; it only verifies that the method was called. Run a real database instead and the test suite slows to a crawl, so you run it less often. Either way, your filter logic ends up duplicated: once in the production code that hits the database, once in the mocks that bypass it. The two drift apart silently until a bug ships to production.