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

Laravel框架中如何将控制器读取的JSON文件数据传递至Blade视图

解决Laravel中加载JSON文件并传递数据到视图的问题

没问题,我来一步步帮你搞定这个数据传递的事儿。你现在的代码有两个核心问题:一是构造函数里的$data是局部变量,控制器的方法访问不到;二是视图里的变量调用方式不对。咱们来逐个修正:

步骤1:将JSON数据转为控制器类属性

首先,在控制器类里定义一个类属性,这样构造函数加载的数据能被后续的方法访问到。同时推荐把json_decode的第二个参数设为true,转成关联数组,在Laravel里使用更顺手:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class BikeController extends Controller
{
    // 定义类属性存储JSON数据
    protected $bikeData;

    public function __construct()
    {
        // 加载JSON文件
        $path = base_path('resources/data/rooms.json');
        $content = file_get_contents($path);
        // 转成关联数组(第二个参数true)
        $this->bikeData = json_decode($content, true);
    }

    // 对应bikes.blade.php的控制器方法,比如叫index
    public function index()
    {
        // 将数据传递到视图,这里把变量命名为bikes,方便视图调用
        return view('bikes')->with('bikes', $this->bikeData);
        // 也可以用compact写法:return view('bikes', compact('bikeData'));
        // 这种情况下视图里要使用$bikeData来访问数据
    }
}

小提示:如果想更贴合Laravel的最佳实践,可以用Illuminate\Support\Facades\File来读取文件,避免原生函数的一些隐患:

$content = \File::get(base_path('resources/data/rooms.json'));

步骤2:修正视图中的变量调用

你的视图里{{ content[1] }}有两个问题:一是变量名不对(咱们传递的是bikes或者bikeData),二是JSON数组的索引从0开始,你示例里的第一个元素是索引0,不是1。修改后的视图代码如下:

@extends('layouts.default')
@section('content')
<main>
    {{-- 输出第一个自行车的名称 --}}
    <h1>{{ $bikes[0]['name'] }}</h1>
    {{-- 输出它的分类 --}}
    <p>分类:{{ $bikes[0]['category'] }}</p>
    {{-- 遍历图片列表 --}}
    @foreach($bikes[0]['images'] as $image)
        <img src="{{ $image }}" alt="自行车图片">
    @endforeach
</main>
@endsection

额外说明

如果你的JSON文件里有多个自行车数据,想遍历所有内容,视图里可以直接循环$bikes数组:

@foreach($bikes as $bike)
    <div class="bike-item">
        <h2>{{ $bike['name'] }}</h2>
        <p>ID: {{ $bike['id'] }}</p>
    </div>
@endforeach

这样就能顺利把JSON里的数据传递到视图并正确渲染啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 21:18:10