Jak přenést query parametry u FILTER_IN/OUT?
- d@rkWolf
- Člen | 167
Zdravím, narazil jsem na technický problém při zabudování přihlašování do systému, co mám na weby a který předtím front-end přihlášení neměl.
Používám router napojený na DB, abych si mohl vytvářet url všeho jak chci a v jakém jazyce chci, takto:
->addRoute('[<locale=' . $locale . '>/][<url>][/<id>]', [
null => [
RouteAlias::FilterIn => function (array $params): ?array {
$url = ($params['url'] === '') ? null : $params['url'];
$row = $this->routingRepo->routeIn($url, $params['locale']);
if (!$row) {
return null;
}
$route = [
'locale' => $row->lng,
'presenter' => $row->presenter,
'action' => $row->action,
'itemId' => $row->item_id,
//'id' => $params['id'],
];
if (isset($params['page'])) {
$route['page'] = $params['page'];
}
return $route;
},
RouteAlias::FilterOut => function (array $params): ?array {
$itemId = isset($params['itemId']) ? $params['itemId'] : 1;
// non-existent locale = 404
if (!isset($params['locale'])) {
return null;
}
$row = $this->routingRepo->routeOut($params['presenter'], $params['action'], $itemId, $params['locale']);
if (!$row) {
return null;
}
$route = [
'locale' => $row->lng,
'url' => $row->slug,
'id' => isset($params['id']) ? $params['id'] : null,
];
if (isset($params['page'])) {
$route['page'] = $params['page'];
}
return $route;
},
],
])
Chtěl jsem zabudovat funkci na reset hesla s ověřením tokenu přes email a zjistil jsem, že bohužel nedám do adresy žádný query parametr, ani s ním url nesestavím, ani ho nezavolám – když zadám adresu jako domena/new-password?token=xyz, na adrese se provede redirect, který ten query odstraní.
V mailu sestavuju adresu takto-vyleze jen url bez ?token=
{var $args = [itemId => 12, token => $vars['token']]}
<a n:href="Front:Sign:newPw ...$args">Generate new password</a>
Nedá se do routy nějak nastavit, aby to query parametry nechalo být? Aby i přes ty FilterIn/Out v adrese zůstávaly a daly se použít v Action metodách?
Editoval d@rkWolf (25. 3. 20:35)
- d@rkWolf
- Člen | 167
Už mi to došlo po tom, co jsem to napsal, že si sem budu muset přidat nějaký seznam povolených parametrů, protože jinak mi je to nepředá. Nějak jsem si původně myslel, že to bere parametry za ? automaticky. Čumím na to a došlo mi, že ten „page“ parametr je to samé, je to parametr použitý u stránkování.
- jeremy
- Člen | 54
Proc proste neudelas return array_merge($params, $route);
?
Takhle ti zustanou vsechny ostatni parametry v url a zaroven se ti predaj nebo
prepisou parametry, ktery sis nastavil v $route
. Seznam povolenych
parametru mi prijde jako zbytecny omezeni. Jestli se do url prida parametr,
ktery se v aplikaci nikde nepouziva, tak se prece nic nestane.
- d@rkWolf
- Člen | 167
@jeremy to pak propisuje tohle všechno do adresy, např.:
domena/password-recovery?itemId=11&action=reset&_fid=w7rk&presenter=Sign
nebo:
domena/log-in?itemId=9&action=default&presenter=Sign
nebo:
domena/about-us?action=default&itemId=2&presenter=Pages
což jako úplně není něco, co by se mi líbilo…ale ty messages s tím
začnou fungovat, takže by možná stačilo přidat si tam if
na _fid
Editoval d@rkWolf (26. 3. 15:05)
- jeremy
- Člen | 54
To by se dalo vyresit tak ze si tyhle zakladni parametry v
FilterOut
proste unsetnes:
//...
unset($params['locale'], $params['presenter'], $params['action'], $params['itemId']);
//...
return array_merge($params, $route);
Takhle budes mit misto
domena/password-recovery?itemId=11&action=reset&_fid=w7rk&presenter=Sign
→ domena/password-recovery?_fid=w7rk