Symfony 22.09.2026 · 2 min čitanja

Symfony 8 ruši aktivacijski mail na localhostu — a validacija prolazi

Od Symfonyja 8 Assert\Url zadano traži vršnu domenu, pa localhost pada. Zamka nije u samoj promjeni, nego u tome što je isto pravilo na dva mjesta — i prvo prođe, a drugo sruši aplikaciju s 500.

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.