如何使用 Phalcon 将 GET 参数附加到所有 url

How to append a GET parameter to all urls using Phalcon

给定一个检索到的页面,例如:

http://myapp.dev/path/subfolder?param=abc

每当出现名为 param 的附加 GET 参数时,它应该自动添加到我在 .volt 模板中构建的导航中的所有后续 links。例如:

<a href="{{ url('path/subfolder2') }}">Go to subfolder 2</a>

即基于这个 .volt link 目标是生成:

<a href="http://myapp.dev/path/subfolder2?param=abc">Go to subfolder 2</a>

如果您只想为给定的 link 附加查询字符串参数,您可以使用 Luke 的解决方案。 但是我认为您想实现一些不同的东西,它涉及自定义逻辑。为此,我们应该创建一个自定义电压函数。

自定义函数定义:

public static function urlFor($params, $queryStringParams = [])
{
    $di = \Phalcon\DI::getDefault();
    if ($di->getRequest()->has('param')) {
        $queryStringParams['param'] = $di->getRequest()->get('param');
    }
    return $di->getUrl()->get($params, $queryStringParams);
}

上述函数与Phalcon中的url()函数作用相同,它只是允许我们在将参数传递给url()之前编写一些自定义逻辑。 在您的情况下,我们检查 URL 是否包含所需的查询参数,并将其添加到当前请求生成的每个 URL 中。在我的例子中,上面的函数在帮助文件中,所以我可以在任何需要的地方使用它。

这是我们的视图服务定义:

$di->set('view', function() use ($di) {
    $view = new \Phalcon\Mvc\View();
    ...
    $view->registerEngines([
        '.phtml' => function($view, $di) {
            $volt = new \Phalcon\Mvc\View\Engine\Volt($view, $di);
            $options = [
                'compiledPath' => $di->getConfig()->site->path->cache . 'volt/frontend/',
                'compiledExtension' => '.php',
                'compileAlways' => $di->getConfig()->debug,
            ];
            $volt->setOptions($options);

            ...
            
            // IMPORTANT PART: Overwriting default url() function in Volt
            $compiler = $volt->getCompiler();
            $compiler->addFunction('url', function($resolvedArgs, $exprArgs){
                return 'Helpers\Common::urlFor(' . $resolvedArgs . ')';
            });
            return $volt;
        }
    ]);
    return $view;
});

请注意上面代码块中的重要部分注释。

让我们以示例结束:

用户在这个地址: http://myapp.dev/path/subfolder?param=abc

但是在您的代码中某处您想要生成 link 新闻页面:

<a href="{{ url('news/list') }}">News</a>

我们的代码将捕获 URL 中的 param 并生成以下地址:

http://myapp.dev/news/list?param=abc