如果您只想为给定链接附加查询字符串参数,您可以使用 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);
}
url()
上述函数的作用与Phalcon中的函数相同,只是允许我们在将参数传递给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;
});
请注意上述代码块中的重要部分注释。
让我们以示例结束:
用户在这个地址:
http ://myapp.dev/path/subfolder?param=abc
但是在您的代码中的某个地方,您想生成一个指向新闻页面的链接:
<a href="{{ url('news/list') }}">News</a>
我们的代码将捕获param
URL 中的 并生成以下地址:
http://myapp.dev/news/list?param=abc