Nadogradnja na Symfony 8, registracija korisnika lokalno: obrazac prolazi validaciju, zahtjev uredno kreće, i — 500. U logu greška validacije URL-a koji je trenutak ranije prošao. Na produkciji ništa od toga. Savršen recept za sat vremena gledanja u krivi dio koda.
Što se promijenilo u Symfonyju 8
Ograničenje Assert\Url sada zadano zahtijeva vršnu domenu: primjer.hr prolazi, localhost ne, kao ni bilo koji host bez točke. Opcija requireTld postojala je i prije, ali s obrnutim zadanim ponašanjem. Promjena je razumna za produkciju — gotovo nijedna stvarna adresa nema host bez domene — i savršeno nevidljiva dok ne pokrenete nešto lokalno s adresom poput http://localhost:5173.
Zašto je validacija prošla, a aplikacija pala
Prvo pravilo stajalo je na ulaznom objektu zahtjeva: polje za povratnu adresu koju sučelje šalje. Tu smo requireTld odmah isključili i obrazac je prošao. Ali aplikacija je istu adresu još jednom validirala dublje — u servisu koji sastavlja poveznicu za aktivacijski mail, s vlastitim Assert\Url pozivom i zadanim postavkama. Prva provjera prođe, druga baci iznimku usred slanja maila, i umjesto lijepe poruke korisnik dobije 500.
Popravak i stvarna pouka
Tehnički popravak je trivijalan: requireTld: false na oba mjesta. Stvarna pouka je da isto pravilo validacije ne smije živjeti na dva mjesta s dvije konfiguracije. Validacija pripada granici sustava, ondje gdje podatak ulazi; duboko u servisu ne bi trebalo biti iznenađenja o obliku podatka koji je već prošao ulaz. Drugu provjeru nismo popravili nego uklonili.
Što još pukne pri prelasku
Isti prelazak uklonio je i metodu add() na konzolnoj aplikaciji u korist addCommand() — sitnica koja ruši svaku ručnu registraciju naredbi. Obje promjene imaju zajedničko: dokumentirane su, razumne, i primijetite ih tek kad vam nešto padne. Prije nadogradnje velike verzije vrijedi proći popis promjena s pitanjem „gdje se u mom kodu ovo zadano ponašanje prešutno koristi?”
Greška koja se vidi samo lokalno nije manje ozbiljna — samo je strpljivija.