Laravel Blade模板调用数据文件数组及语法差异问题
问题核心原因
你当前代码无法正常遍历输出,和引入文件的方式无关——控制器已经正确调用Data::getSkills()把数据传给视图了,dd()能正常输出就证明传值链路完全通顺,报错来自两个模板语法错误:
getSkills()返回的是普通PHP数组,不是对象实例,不能用->访问元素,必须用数组下标[]取值- Blade模板里混入了JSX语法(
className属性、{变量}的输出写法),且@foreach循环块没有包裹实际要渲染的列表项,部分标签还存在未闭合问题。
@include/require/use 语法差异 三者适用场景完全不同,你之前尝试在Blade里用它们引入Data类文件全是场景错用:
@include:Blade模板引擎自带的视图引入指令,仅可用于引入resources/views目录下的其他Blade视图文件,接收的参数是视图的相对路径(支持斜杠或点分隔),不能用来加载PHP类文件。require:PHP原生的文件加载语法,作用是按指定文件路径加载并执行PHP文件,Laravel已经配置了完整的类自动加载规则,带命名空间的类不需要手动require加载,在Blade里写原生require不仅违反MVC分层约定,还极易出现路径错误、重复加载的问题。use:PHP原生的命名空间导入语法,必须写在PHP文件的头部(命名空间声明语句之后),不能直接写在Blade模板的渲染逻辑里导入类。如果确实要在模板里调用类,需要写完整的类命名空间,例如{{ \App\Data::getSkills() }},但不推荐在视图层直接调用业务类。
修正方案
你的Data.php和SkillsController代码逻辑完全正确,不需要修改,只需要修正Blade模板的语法即可:
@include('layouts.navbar') <div id="competences"> <div class="skills"> <h1 class="skills-title"><span>*</span>Skills</h1> <h2 class="subtitle"><span>•</span> Languages and frameworks</h2> <ul class="skills-list"> @foreach ($skills as $skill) <li class="skills-list-skill"> <p>This is skill {{ $skill['name'] }}</p> {{-- 注意:当前Data类返回的数组只有name字段,需要先给数组项补充icon、title键值,再放开以下代码 <img src="{{ $skill['icon'] }}" alt="" class="skills-list-skill-icon" /> <p class="skills-list-skill-title">{{ $skill['title'] }}</p> --}} </li> @endforeach </ul> </div> <div class="secondary-skills"></div> </div> @include('layouts.footer')
如果后续要渲染技能图标、标题字段,只需要在Data.php的返回数组里给每个项补充对应的icon、title键值对即可。
内容的提问来源于stack exchange,提问作者Storm28
相关产品推荐
相关产品推荐

