RFC – rozšířit syntaxi parametru $destination v metodě LinkGenerator::link()
- m.brecher
- Generous Backer | 871
Ahoj,
odkazy lze v Nette vytvářet metodou link($destination) buďto presenteru, nebo LinkGenerátoru. Syntaxe parametru $destinationn je ale v LinkGenerátoru problematická, protože se liší od syntaxe použité v metodě stejného jména v presenteru:
- $linkGenerator->link(':Admin:Home:default') // InvalidLinkException
- $presenter->link(':Admin:Home:default') // OK
- $linkGenerator->link('//:Admin:Home:default') // InvalidLinkException
- $presenter->link('//:Admin:Home:default') // OK
- $linkGenerator->link('Admin:Home:default') // OK
- $presenter->link('Admin:Home:default') // Compile Error
Presenter a LinkGenerátor nepoužívají pro odkaz $destination stejnou syntaxi, dokonce co presenter uznává za platnou adresu, LinkGenerátor odmítá a naopak. To je pro vývojáře matoucí.
Ideální by bylo, kdyby LinkGenerátor používal stejnou syntaxi pro absolutní adresy jako Presenter. Aby nevznikl BC break, můžeme ke stávající syntaxi $destination v LinkGenerátoru jednoduše syntaxi používanou Presenterem přidat.
Řešením je přidat na začátek metody link() v třídě LinkGenerátor následující kód:
if(str_starts_with($dest, '//:')){
$dest = substr($dest, 3);
}elseif(str_starts_with($dest, ':')){
$dest = substr($dest, 1);
}
Po úpravě zdrojového kódu třídy LinkGenerator lze použít všechny 3 způsoby, což je ideální:
- $linkGenerator->link(':Admin:Home:default') // OK
- $linkGenerator->link('//:Admin:Home:default') // OK
- $linkGenerator->link('Admin:Home:default') // OK
PR na githubu: https://github.com/…ion/pull/328
Poznámka: vzhledem k čerstvým změnám v nette/application a přidání aliasu pro $destination začínající znakem @ jsem kód pro PR poupravil takto:
if(str_starts_with($dest, '//:') && !str_starts_with($dest, '//:@')){
$dest = substr($dest, 3);
}elseif(str_starts_with($dest, ':') && !str_starts_with($dest, ':@')){
$dest = substr($dest, 1);
}
Editoval m.brecher (10. 4. 20:26)
- David Grudl
- Nette Core | 8227
Ve větvi 3.2-dev je generování odkazů v prezenterech a LinkGeneratoru sloučeno a syntaxe je shodná.