【问题标题】:How to append a GET parameter to all urls using Phalcon如何使用 Phalcon 将 GET 参数附加到所有 url
【发布时间】:2016-09-09 08:11:55
【问题描述】:

给定一个页面,例如:

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>

【问题讨论】:

  • 有理由不处理这个服务器端吗?

标签: phalcon phalcon-routing


【解决方案1】:

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

【讨论】:

  • 我看不出不使用标准 url 组件的意义。不要重新发明轮子。
  • 请仔细阅读问题。它不是重新发明轮子,而是使用自定义逻辑进行扩展。如果他同意你的解决方案,他将不得不检查参数是否存在并附加它。
  • 通过使用例如在基本控制器中管理的参数数组来完成它会更简单(为所有视图全局添加它)。但是这种方式也行得通,只是有点长而且不标准
  • imo,这个答案更好地回答了这个问题。因为OP专门询问GET parameter called param is present。 (而不是“视图”参数)
  • @Luke 为了保持{{ url(..) }} 的默认行为,还可以使用任何其他名称添加该函数,使其仅在特定调用中使用,例如{{ urlFor(..) }}
猜你喜欢
  • 1970-01-01
  • 2012-01-18
  • 2014-11-28
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 2022-06-24
相关资源
最近更新 更多