Prosím o otestování Nette Routing 3.1 RC

David Grudl
Nette Core | 8129
+
0
-

Než vyjde Nette Routing v3.1, poprosil bych vás o otestování RC verze. Je tam oprava určitého chování a rád bych se ujistil, že je zcela zpětně kompatibilní. Díky!

Stačí dát do composeru

	"require": {
		"nette/routing": "^3.1.0-RC",
dakur
Člen | 493
+
0
-

Mně se aplikace s touto RC na určitých routách zacyklí, zatím ale nevím proč. 🙂

dakur
Člen | 493
+
0
-

Presenter#requestToUrl() – resp. $this->router->constructUrl() v ní – vrátí jiný výsledek než by mělo. Má být: /xyz/abc/working-draft, vrátí /xyz/abc/. Routa je /xyz/abc/<version>, version je value object.

nette/application: dev-master#6a861fab7bb50dad84211fa6124dbe3d37b14f57

Doteď jsem teda navíc nette/routing neměl ani v composer.json, spoléhalo to na závislost jiného balíčku, tak nevím, jestli tam nemůže být taky problém.

Editoval dakur (25. 2. 2021 17:44)

David Grudl
Nette Core | 8129
+
0
-

Můžeš sem poslat (ořezaný) router, který se tak chová?

dakur
Člen | 493
+
0
-

Zredukoval jsem to na toto a zjistil jsem, že když oddělám parametr campaignId, tak to funguje, takže bude problém spíš s tím VO CampaignId. V Routing\Route#preprocessParams() zůstane campaignId v $params a potom v compileUrl() to skočí do větve isset($this->metadata[$name][self::FIXITY]) a $required === null && !$brackets se vyhodnotí jako false ($required === null, $brackets === []). Nevylučuji ani chybu u nás.

// zredukováno na jedinou routu v celé appce

$router = new RouteList();
$uuidPattern  ='\A[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\z';
$uuidPattern = \trim($uuidPattern, '\A\z');
$router->addRoute(
	'campaign/<campaignId>/<version>',
	[
		'presenter' => 'Campaigns:CampaignViewer',
		'action' => 'default',
		'campaignId' => [
			Route::PATTERN => $uuidPattern,
			Route::FILTER_IN => static function (string $campaignId): CampaignId {
				return CampaignId::of($campaignId);
			},
			Route::FILTER_OUT => static function (CampaignId $campaignId): string {
				return $campaignId->toString();
			},
		],
		'version' => [ // zjednodušeno
			Route::PATTERN => 'working-draft',
			Route::VALUE => new WorkingDraftIdentifier(),
			Route::FILTER_IN => static function (string $version): ?WorkingDraftIdentifier {
				if ($version === 'working-draft') {
					return new WorkingDraftIdentifier();
				}

				return null;
			},
			Route::FILTER_OUT => static function (WorkingDraftIdentifier $version): string {
				return 'working-draft';
			},
		],
	],
);


// CampaignId vypadá de facto takto + pár dalších metod
final class CampaignId
{
	private function __construct(
		private UuidInterface $uuid,
	) {}

	public static function of(string $uuid): self
	{
		return new self($uuid);
	}

	public function toString(): string
	{
		return (string) $this->uuid;
	}
}

Editoval dakur (25. 2. 2021 20:24)

dakur
Člen | 493
+
0
-

Zapomněl jsem ještě zmínit, že problém nastane při kanonizaci URL v Presenter třídě. Tedy při ověřování /campaign/{uuid}/working-draft to chce přesměrovat na /campaign/{uuid}. (A proto, že máme redirect v opačném směru, tak jsem na začátku psal, že se to zacyklilo.)

Povedlo se mi to rozbít v nette/sandboxu, zde je commit ve forku s mým use-casem: https://github.com/…f8ab5d3ee6be

Nakonec to vypadá, že problém není ani v campaignId, ani ve version, ale v jejich kombinaci. 🤷‍♂️

Editoval dakur (26. 2. 2021 8:43)

David Grudl
Nette Core | 8129
+
0
-

Super, díky!

David Grudl
Nette Core | 8129
+
0
-

@dakur sorry že se k tématu vracím až s ročním odstupem. Verzi 3.1 jsem tehdy kvůli zmíněným problémům nevydal, teď jsem se k tomu konečně dostal a zkouším tvůj sandbox. Mám ale pocit, že ten problém co zmiňuješ, se děje i v původní verzi 3.0.2. Dělám něco špatně? Nebo už je to tak dávno, že všechno je jinak? :-)

dakur
Člen | 493
+
0
-

@DavidGrudl Díky za zprávu. Nic jsem s tím od té doby nedělal, na 3.0.2 mi to celou dobu běží.

Když jsem to tenkrát zkoušel, musel jsem asi updatnout nette/application, protože jak píšu výše, nette/routing ani přímo v composer.json nemám. Tak nevím, jestli nemůže být problém i v tom nějak.. Pokud ti to dělá v tom sandboxu na 3.0.2, tak se na to budu muset ještě podívat.

dakur
Člen | 493
+
0
-

@DavidGrudl Ta chyba tam je, ale byla chyba i v tom mém repu, měl jsem tam jenom jedno view pro dvě routy, takže to vždy kanonikalizovalo na tu první. Opravil jsem to.

Nicméně ten problém, který jsem původně hlásil, je s nejvyšší pravděpodobností způsobený tímto commitem. Nekrokoval jsem to, ale po revertu daného commitu se to rozjede, jak má. Zkoušel jsem to i upravit ve vendor složce v appce a taky to začalo šlapat (aspoň teda na tom místě, kde se to předtím cyklilo).

dakur
Člen | 493
+
0
-

Konkrétně teda tím přechodem z === na ==, abych to upřesnil.