Page 14 - Monthly Archives: December 2025
-
Maxim Mironjuk
-
December 15, 2025
Debugging PHPUnit tests in a Docker environment with PhpStorm is one of the most frustrating parts of PHP development. Configuration usually fails because of XDEBUG_MODE, incorrect path mapping, or a remote interpreter that was never set up correctly. This guide shows the complete path, from installing Xdebug to running coverage reports.
-
Maxim Mironjuk
-
December 14, 2025
Blue green deployment replaces the risky, gradual rollout with a single, instantly reversible cut: two fully identical environments run in parallel, the load balancer points at one while the new version is fully prepared and tested in the other. This article shows how blue green deployment for Symfony is built in practice, including database, sessions and rollback.
-
Maxim Mironjuk
-
December 14, 2025
A confetti animation sounds like a job for a ready-made library, but once you understand the Canvas API, all you really need is Alpine.js. Particle physics, color palettes, requestAnimationFrame, and clean memory cleanup all fit neatly inside a single x-data component.
-
Maxim Mironjuk
-
December 14, 2025
A classic PHP-FPM request automatically frees all its memory at the end, while a Swoole or RoadRunner worker lives on through thousands of requests within the same process. That exact difference turns static state, forgotten closures and growing caches into a real memory leak that slowly eats up available memory over hours of operation.
-
Maxim Mironjuk
-
December 13, 2025
Currying breaks a multi-argument function into a chain of single-argument functions, partial application freezes some arguments upfront. Both techniques can be rebuilt in PHP 8.4 without any external library, using closures, and they cut repeated parameters down to a minimum.
-
Maxim Mironjuk
-
December 13, 2025
Serving a generic error message with an HTTP status of 200 for a URL that does not exist quietly costs both search engine trust and real users. This article shows how to properly implement 404 and 500 error pages in the Hyvä theme, from the noroute controller through the correct HTTP status code to an Nginx fallback for when PHP-FPM itself stops responding.
-
Maxim Mironjuk
-
December 13, 2025
A back to top button sounds like a trivial UI element, but on closer inspection turns out to be a small bundle of detail decisions: when it should appear, how it scrolls, where focus goes after the click, and how it coexists with other fixed elements such as cookie banners. Alpine.js delivers a compact, fully accessible pattern for exactly that.
-
Maxim Mironjuk
-
December 13, 2025
mironsoft.de › Blog › Design Patterns
Magento 2 · Design Patterns
The Preference Pattern
in Magento 2
Preferences in di.xml bind interfaces to concrete implementations, or override existing classes. This is the most powerful tool in the DI system, and also the one most often misused. Interface-first design, preference conflicts, and virtual types as an alternative.
15 min read
PHP 8.4
Magento 2.4.8
What are preferences in Magento 2?
Preferences are DI configurations in the di.xml file that tell the Magento 2 ObjectManager which concrete PHP class it should instantiate when a given interface or class is requested. The term "preference" means exactly that:
-
Maxim Mironjuk
-
December 12, 2025
An unprotected main branch is only one bad force-push away from a complete disaster. This article explains what protected branches on GitHub and GitLab actually prevent, how required status checks and approval rules work, what role CODEOWNERS plays, and what baseline keeps main safe and practical for Magento and Hyva agencies without slowing the team down.
-
Maxim Mironjuk
-
December 12, 2025
Magento's built-in full page cache relies on unique URLs and HTML responses that get cached as a single unit and invalidated via tags. GraphQL breaks that model: a single POST endpoint, freely combinable query strings, variables, and partly personalized fields produce a wide range of different responses that can no longer be identified cleanly by a URL. Anyone running Magento headless or as an API backend for a custom frontend needs a dedicated caching layer on the query level instead. Redis is particularly well suited for this, because query results can be stored there as granular individual keys, tagged precisely, and invalidated selectively without flushing the entire cache.
-