Prosím o otestování Nette Routing 3.1 RC
- David Grudl
- Nette Core | 8218
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
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)
- dakur
- Člen | 493
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
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 | 8218
@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
@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
@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).