Jak přenést query parametry u FILTER_IN/OUT?

d@rkWolf
Člen | 165
+
0
-

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)

Pepino
Člen | 249
+
+3
-

Ty parametry máš v proměnné $params. Stačí je jen přidat do tvojí $route.

Kamil Valenta
Člen | 762
+
+3
-

Nebo modifikovat přímo $params a žádnou $route nevytvářet.

d@rkWolf
Člen | 165
+
0
-

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í.

d@rkWolf
Člen | 165
+
0
-

Další, co to nepřenáší, jsou zřejmě Flash messages po redirectu. Když si ju vykreslím jen tak, zobrazí se tam kde chci, ale po redirectu je Flashes prázdné. Jen si nejsem jistý, jaký parametr povolit.

jeremy
Člen | 50
+
0
-

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 | 165
+
0
-

@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 | 50
+
+2
-

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=Signdomena/password-recovery?_fid=w7rk

d@rkWolf
Člen | 165
+
0
-

Jo, to by asi taky šlo, já to promyslím… :)