PHP Presenter框架下跨目录AJAX GET请求Latte模板文件失败问题咨询
结论
你当前的实现方式不可行,具体原因和替代方案如下:
问题根因
root/app/presenters/templates/属于服务端内部代码目录,默认不会被web服务器映射为公网可访问路径,前端直接请求该路径下的.latte文件会直接返回404。.latte是服务端模板文件,需要PHP层渲染解析内部的模板语法、注入服务端变量后才能生成合法的HTML内容,直接请求原始.latte文件即使能拿到内容,浏览器也无法识别其中的Latte语法,无法正常渲染。
符合要求的替代方案(无需新增Presenter/类)
你只需要在当前渲染function.latte的已有Presenter中新增一个轻量的处理方法即可,不需要额外创建新的类或Presenter:
- 找到你当前负责渲染该页面的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(); }
- 修改你的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
相关产品推荐
相关产品推荐

