如何使用 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/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
并生成以下地址: