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

时间:2016-09-09 08:11:55

标签: phalcon phalcon-routing

给定一个页面,例如:

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

每当存在名为 param 的附加GET参数时,它应自动添加到我的导航中的所有后续链接中,如.volt模板中构造的那样。例如:

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

即。基于此.volt链接,目标是生成:

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

1 个答案:

答案 0 :(得分:0)

如果您只想为给定的链接附加查询字符串参数,您可以使用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;
});

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

让我们以示例结束:

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

但是在代码中的某处,您希望生成指向新闻页面的链接:

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

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

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