You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Grav框架中如何将URL从Twig模板传递至自定义插件函数

问题分析与解决方案

问题根源

你遇到的$url为null的问题,核心出在Twig模板的URL处理环节:

  • page.url(true)|e中的|e转义会把URL里的特殊字符转为HTML实体(比如&变成&),导致后续parse_url过滤器无法正确解析出host,最终url变量为空。
  • 手动解析页面URL获取域名的方式,不如直接使用Grav内置全局变量可靠。

修复步骤

1. 修改Twig模板代码

直接用Grav提供的site.url全局变量获取网站根域名,无需手动解析页面URL:

{% extends 'partials/base.html.twig' %}

{% block content %}
    {# 直接获取网站完整根URL(如https://yourdomain.com) #}
    {% set url = site.url %}
    {{ url }}

    {% set data = getdata(url) %}
{% endblock %}

如果确实需要解析当前页面的完整URL,必须去掉|e转义:

{% set fullUrl = page.url(true) %}
{% set parsedUrl = fullUrl|parse_url %}
{% set url = parsedUrl.host %}

2. 优化插件函数逻辑

考虑到传入的URL可能缺少协议(比如直接传入yourdomain.com),在插件中做兼容处理,确保parse_url能正确解析:

public function getFunctions(): array
{
    return [
        new \Twig_SimpleFunction('getdata', [$this, 'exampleFunction'])
    ];
}

public function exampleFunction($url)
{
    // 补全缺失的HTTP/HTTPS协议
    if (!preg_match('#^https?://#i', $url)) {
        $url = 'https://' . $url;
    }
    
    $host = parse_url($url, PHP_URL_HOST);
    if ($host === null) {
        echo 'Invalid URL';
    }
    dump($host);
}

验证方法

在Twig模板中先通过{{ dump(url) }}确认url变量是否有值,再传递给插件函数,能快速定位是模板变量问题还是插件接收问题。

内容的提问来源于stack exchange,提问作者Abdeltif

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:55:04