RFC – rozšířit syntaxi parametru $destination v metodě LinkGenerator::link()

m.brecher
Generous Backer | 774
+
+9
-

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)

mystik
Člen | 296
+
+5
-

Jsem 100% pro. My si kvuli tomu museli nad link() z LinkGenerator udelat wrapper protoze jinak nesly pouzivat stejne konfiguracni hodnoty.

Felix
Nette Core | 1190
+
0
-

Take to tak delam.

David Grudl
Nette Core | 8173
+
+12
-

Ve větvi 3.2-dev je generování odkazů v prezenterech a LinkGeneratoru sloučeno a syntaxe je shodná.