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

PHP Presenter框架下跨目录AJAX GET请求Latte模板文件失败问题咨询

结论

你当前的实现方式不可行,具体原因和替代方案如下:

问题根因

  • root/app/presenters/templates/ 属于服务端内部代码目录,默认不会被web服务器映射为公网可访问路径,前端直接请求该路径下的.latte文件会直接返回404。
  • .latte是服务端模板文件,需要PHP层渲染解析内部的模板语法、注入服务端变量后才能生成合法的HTML内容,直接请求原始.latte文件即使能拿到内容,浏览器也无法识别其中的Latte语法,无法正常渲染。

符合要求的替代方案(无需新增Presenter/类)

你只需要在当前渲染function.latte的已有Presenter中新增一个轻量的处理方法即可,不需要额外创建新的类或Presenter:

  1. 找到你当前负责渲染该页面的Presenter(通常对应模板路径为ObligationPresenter.php),新增如下方法:
public function actionGetDataTemplate(string $toSearch)
{
    // 把请求参数注入模板
    $this->template->toSearch = $toSearch;
    // 指定要渲染的data.latte模板路径
    $this->template->setFile(__DIR__ . '/templates/obligation/data.latte');
    // 直接返回渲染后的HTML,不加载其他布局
    $this->sendTemplate();
}
  1. 修改你的AJAX请求代码,请求地址改为对应Presenter的action路由即可,示例如下:
var xmlhttp = new XMLHttpRequest();
xmlhttp.open('GET', "/obligation/get-data-template?toSearch=" + something, true);
xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
        // 把渲染好的HTML插入到目标节点
        document.getElementById('firma_pass').innerHTML = xmlhttp.responseText;
    }
};
xmlhttp.send();

补充说明

如果你的data.latte内没有服务端动态逻辑,仅包含静态HTML,你可以把内容复制后放到root/web/目录下的.html文件中,直接请求该HTML文件即可,但该方案仅适用于无服务端动态渲染需求的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:54:03