Page 112 - Maxim Mironjuk
-
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.
-
Maxim Mironjuk
-
December 07, 2025
Anyone who copies the same helper code into several projects eventually loses track of which version runs where. Your own Composer package solves this: one composer.json, one PSR-4 namespace, one version number per Git tag, and a single source of truth. This article walks the complete path from the first directory structure through Git tags to registration on Packagist, with real, traceable PHP 8.4 code.
-
Maxim Mironjuk
-
December 07, 2025
Most REST resources carry far more fields than a given client actually needs, and nested resources make that worse by pulling in entire related objects. A generic ?fields= parameter with dot-notation support solves this once, centrally, in the serializer, instead of being reimplemented for every endpoint.
-