Crash early

A dead program normally does a lot less damage than a crippled one.

The Pragmatic Programmer, Tip #38, page 113

Have you ever thought about what can go wrong when the application’s logic is broken, but it continues to work? That might happen when the values are not the ones that you expect. For example, a method/function returns an integer, but a negative one, but you expect it to be positive. Another example is trying to access an unknown array key. The database returns an invalid value. You name it.

What if you won’t allow it and crash early? Yes, the client will see “an error occurred, our engineers are working on it”. The actual benefit is that the program will exit and not cause any harm. No corrupted data in the database nor missing files.

How to crash early in the PHP? There are two ways. Throwing a \LogicExpcetion or enabling assertions on production and using them.

Continue reading Crash early

Symfony & PSR-16 Simple Cache

This week I was working on the integration with the Optimizely Feature Toggles.

Its PHP SDK is mediocre.

It makes the HTTP request for the data file whenever the new PHP process is executed.

The data file is in our case larger than 2 MB, so it has to download a large file, but also validate it and parse it.

That makes around 700 ms overhead on each process.

Therefore I needed a cache mechanism.

But, as we try to write the software in a framework-agnostic way, I wanted to use the industry standard interface – the PSR-16 Simple Cache, to not be coupled to a specific cache implementation.

Continue reading Symfony & PSR-16 Simple Cache

YAML anchors & aliases

Hey! Last week I was focused on moving the API specification from slatedocs to OpenAPI. This was the first that I had the pleasure of writing a schema by hand, before that I always generated it. I learned a lot and I would like to share one thing.

By default the OpenAPI allows you to define a schema for reusability. But there is one more thing that you can do for reusability – YAML anchors and aliases. By using it you can reuse much more than just a schema:

Continue reading YAML anchors & aliases

Wpływ silence operatora na error reporting w PHP

Hej, w dzisiejszym krótkim wpisie bierzemy na tapet słynny i jakże często używany operator @ tzw. STFU. Czy wiesz że jego użycie ma wpływ na error_reporting w PHP? Weźmy pod lupę ten przykład:

<?php declare(strict_types=1);

error_reporting(E_ALL);

set_error_handler(
    function () {
        // int(0) [PHP <= 7.4]
        // int(4437) [PHP >= 8.0]
        var_dump(error_reporting());
    },
    E_ALL
);

// int(32767) [E_ALL]
var_dump(error_reporting());

@trigger_error('warning', E_USER_WARNING);
Continue reading Wpływ silence operatora na error reporting w PHP

DDD – Polityka i Specyfikacja

Witaj drogi czytelniku! Sieć zawiera mnóstwo informacji na temat elementów konstrukcyjnych DDD takich jak agregaty, encje czy value objects (obiekty wartości? dziwnie to brzmi 🙂). W dzisiejszym wpisie chciałem omówić dwa elementy o których ciężko znaleźć artykuły w sieci, a są bardzo przydatne – specyfikacja i polityka. Postaram Ci się wyjaśnić oba wzorce na prostych przykładach a także na faktycznym kodzie. Napisałem wszystkie przykłady w trzech językach (PHP, JavaScript i Rust), tak by każdy mógł znaleźć coś dla siebie 😁.

Gwoli wyjaśnienia, przygodę z DDD zacząłem około 2 lata temu, nie uważam się za eksperta, uwagi i krytyka są mile widziane 🙂!

Spis treści:

Continue reading DDD – Polityka i Specyfikacja

PhpStorm – Plugin “PHP composer.json” is incompatible

Witaj, dawno się nie słyszeliśmy 🙂 Blog ten się dość mocno zakurzył ostatnio, wynika to z faktu iż w moim życiu prywatnych sporo się zmieniło. Chciałbym to zmienić, postaram się umieszczać krótkie wpisy. Od czegoś trzeba zacząć, by wrócić do starych nawyków 🙂

Problem

Od aktualizacji 2020.1 (lista zmian ↗️) PhpStorm zacząłem otrzymywać taki komunikat:

Jedyne co da się zrobić z poziomu PhpStorm to zamknąć ten komunikat. Nie da się odinstalować tej wtyczki w oknie ustawień programu.

Continue reading PhpStorm – Plugin “PHP composer.json” is incompatible