Laravel与AMP渲染服务端消息报错:未定义变量loged
我猜你肯定是把AMP代码写在Laravel的Blade模板文件里了,对吧?问题的根源其实很简单——Blade模板的语法和AMP Mustache模板的语法冲突了:两者都用{{ }}作为变量占位符。当Laravel渲染Blade模板时,会把AMP里的{{ loged }}当成PHP变量去解析,可这个变量在你的PHP代码里根本没定义,所以就抛出了“Use of undefined constant loged - assumed 'loged'”的错误。
下面给你几个实用的解决方案:
方案1:用Blade的@verbatim指令包裹AMP模板块
这个方法最直观,把包含Mustache语法的AMP代码用@verbatim和@endverbatim包起来,告诉Blade不要解析里面的{{ }}:
<div submit-error> <template type="amp-mustache"> <a style="cursor: pointer;" id="submitloginbtn" on="tap:loginform.show,submitloginbtn.hide" > Réessayer </a> </template> </div> <div submit-success> @verbatim <template type="amp-mustache">Vous êtes connecté {{ loged }}</template> @endverbatim </div>
方案2:单独转义Mustache占位符
如果你只需要转义少数几个{{ }},可以在每个占位符前加个@符号:
<div submit-success> <template type="amp-mustache">Vous êtes connecté @{{ loged }}</template> </div>
Blade会把@{{ }}解析成原生的{{ }}输出到前端,这样AMP就能正确识别Mustache变量了。
方案3:用原生输出标签{!! !!}
如果这段AMP内容里没有需要Blade解析的部分,也可以用{!! !!}直接输出原始HTML,跳过Blade的解析流程:
<div submit-success> {!! '<template type="amp-mustache">Vous êtes connecté {{ loged }}</template>' !!} </div>
另外再提醒你一句:你的userAjaxHasNotLogedIn方法返回的是400状态码的JSON,这个只会触发AMP的submit-error模板;如果是登录成功的场景,记得返回200状态码的JSON(比如return response()->json(['loged' => true], 200)->header('AMP-Access-Control-Allow-Source-Origin',"http://localhost:8000")),这样才会触发submit-success模板哦。
内容的提问来源于stack exchange,提问作者j-dope

