如果您只想为给定链接附加查询字符串参数,您可以使用 Luke 的解决方案。
但是我认为你想要实现一些不同的东西,它涉及自定义逻辑。为此,我们应该创建一个自定义 Volt 函数。
自定义函数定义:
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 中。就我而言,上述函数位于 Helper 文件中,因此我可以在任何需要的地方使用它。
这是我们的 View 服务定义:
$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;
});
请注意上述代码块中的IMPORTANT PART注释。
让我们以示例结束:
用户在这个地址:
http://myapp.dev/path/subfolder?param=abc
但您想在代码中的某处生成指向新闻页面的链接:
<a href="{{ url('news/list') }}">News</a>
我们的代码会捕捉到 URL 中的param,并生成如下地址:
http://myapp.dev/news/list?param=abc