CakePHP 3 向 url 添加额外数据的最佳方式

CakePHP 3 best way to add additional data to url

我想问一下,关于策略,我该如何存档:

我有 url: www.mydomain.com/pages

现在,如果某些 if 子句 return 为真,我想将此参数附加到所有 urls:

www.mydomain.com/pages?id=swa 或 www.mydomain.com?id=swa

我不知道如何开始, 谢谢你的帮助。

您最好的选择可能是使用 URL 过滤器,它会影响使用核心助手或 Router [=41= 生成的所有 URL ],只要它们作为 routing arrays 传递,即

['controller' => 'abc', 'action' => 'xyz', /* ... */]

URLs作为字符串传递,像/abc/xyz不会受到影响!

\Cake\Routing\Router::addUrlFilter(function ($params, $request) {
    $key = 'id';
    $value = 'swa';

    if (!array_key_exists($key, $params)) {
        $params[$key] = $value;
    }

    return $params;
});

这会将参数添加到所有 URL 中(除非他们已经设置了该参数)。但要小心,如果有一个匹配的连接路由定义了同名的路由元素,它会窃取参数并将其用于该元素,而不是将其添加到查询字符串中!

另请注意,这只会影响明确定义动作 URL 的表单动作,如果您希望它也影响选择当前 URL 的动作,那么您还要修改$request->query

$request->query[$key] = $value;

另见

如果是一次性的,您可以使用重定向

return $this->redirect(['controller' => 'Pages', 'action' => 'display', $pageId]);

或通过 html 助手

echo $this->Html->link(
    'Page 1',
    ['controller' => 'Pages', 'action' => 'display', 1]
);