Page 18 - Monthly Archives: December 2025
-
Maxim Mironjuk
-
December 08, 2025
Anyone planning a Redis high availability solution almost always faces the same fundamental choice: Redis Sentinel for automatic failover without sharding, or Redis Cluster for high availability with built in horizontal scaling. Both solve different problems, and picking the wrong one means either unnecessary operational complexity or an architecture that breaks down at the next growth ceiling.
-
Maxim Mironjuk
-
December 08, 2025
How shipping methods in checkout are presented often decides between an abandoned cart and a completed order. In the Hyvä checkout, a lean Alpine.js component that loads its data through a GraphQL availableShippingMethods query replaces the Knockout shipping-rates component. Anyone customizing shipping methods in the Hyvä checkout works with shipping-methods.phtml, ViewModels and custom carrier models instead of uiComponents, observables and RequireJS modules, and gets card layouts, delivery estimates, free shipping thresholds and click and collect as reactive, maintainable building blocks in return.
-
Maxim Mironjuk
-
December 08, 2025
The CSS cascade is not a matter of chance, it is a precisely defined algorithm. Anyone who understands how the browser weighs origin, importance, specificity and order writes stylesheets that behave predictably, instead of fighting their own rules with !important.
-
Maxim Mironjuk
-
December 08, 2025
CMS editors can't write Alpine.js, but they copy HTML from other sources, and attributes like x-show or x-data can be hidden inside foreign code. x-ignore disables Alpine parsing for an entire DOM area and makes CMS content safe.
-
Maxim Mironjuk
-
December 08, 2025
Stabilizing E2E tests with page.waitForTimeout or fixed sleep calls only fights symptoms instead of causes. Before every action, Playwright automatically checks whether an element is visible, stable, enabled and actually clickable, and repeats this check until it passes or a timeout is reached. This article shows how these actionability checks work, why fixed wait times mask flakiness instead of fixing it, and how to precisely diagnose timeout errors with the Trace Viewer.
-
Maxim Mironjuk
-
December 08, 2025
Dependency injection reverses control over how dependencies are created, instead of letting every class instantiate its own collaborators. With no Angular or NestJS in sight, this article shows how constructor injection, a minimal DI container and clean lifecycle management enable loose coupling and easy testability in plain JavaScript.
-
Maxim Mironjuk
-
December 08, 2025
Automatically binding request data to entities or models is convenient, but it can let an attacker send fields like is_admin along with a request and overwrite them. We explain allowlist versus blocklist thinking and walk through a concrete Symfony example using DTOs instead of direct entity binding.
-
Maxim Mironjuk
-
December 07, 2025
The default Tailwind spacing scale covers many projects well, but it quickly reaches its limits once a custom design system enters the picture. Extending the Tailwind spacing scale with @theme in Tailwind v4 on purpose, instead of sprinkling arbitrary pixel values everywhere, produces a spacing system that stays consistent across buttons, cards and full pages.
-
Maxim Mironjuk
-
December 07, 2025
Once an application handles names, comments, or bio texts that might contain emoji, accented characters, or non-Latin scripts, the classic PHP functions strlen() and substr() routinely produce wrong results, because they operate byte by byte instead of character by character. Even the improved mb_* functions still fail on complex emoji made up of several combined Unicode code points that visually render as a single character. The Symfony String component solves this with three clearly separated, immutable string classes that make explicit which level you are actually working on, and this article shows exactly when each one is the right choice.
-
Maxim Mironjuk
-
December 07, 2025
A Bash script that runs cleanly on your own machine can fail on the target system because it runs a different coreutils version, is missing a tool, or ships a different Bash version. Docker test containers make these differences reproducibly visible and can be reused across the CI pipeline instead of being rebuilt from scratch on every run.
-