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

David Grudl
Nette Core | 7465
+
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 | 269
+
0
-

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

dakur
Člen | 269
+
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. 17:44)

David Grudl
Nette Core | 7465
+
0
-

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

dakur
Člen | 269
+
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. 20:24)

dakur
Člen | 269
+
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. 8:43)

David Grudl
Nette Core | 7465
+
0
-

Super, díky!