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