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

CodeIgniter 4中如何将视图数据传递至布局文件?

解决CodeIgniter布局文件无法访问视图数据的问题

你遇到的核心问题是:$this->extend()方法的第二个参数不是用来传递数据的,你当前的写法<?= $this->extend('layouts/default', ['data' => $data]); ?>无法将数据传递到布局文件,这就是布局中$data为null的原因。

下面是几种可行的解决方法:


方法一:在子视图中通过$this->set()传递数据到布局

在你的default/blog/index.php和item.php子视图中,先调用$this->set()把数据传递给布局,再继承布局:

<?php
// 先将数据传递给布局
$this->set('data', $data);
// 继承布局文件
echo $this->extend('layouts/default');
?>

<?= $this->section('content') ?>
<!-- 子视图内容,这里可以正常使用$data -->
<?= $this->endSection() ?>

这样布局文件就能直接访问$data变量了。


方法二:在控制器中共享数据到所有视图

如果希望$data在整个请求的所有视图(包括布局)中都可用,可以在控制器里使用view()->share()方法:

class BlogController extends BaseController
{
    public function index()
    {
        $model = new Blog();
        $data = $model->getBlog();

        // 共享数据到所有视图(布局+子视图)
        view()->share('data', $data);

        return view('default/blog/index');
    }

    public function item($slug = null){
        $model = new Blog();
        $data = $model->getBlog($slug);

        view()->share('data', $data);
        return view('default/blog/item');
    }
}

这种方式下,子视图和布局都能直接使用$data,无需在子视图中额外处理。


方法三:返回视图时链式调用setVar()

也可以在返回视图时用setVar()设置全局可用的变量:

public function index()
{
    $model = new Blog();
    $data = $model->getBlog();

    return view()->setVar('data', $data)->render('default/blog/index');
}

额外建议:避免空值报错

在布局文件中使用变量时,建议增加空值检查,防止出现Trying to access array offset on value of type null异常:

// 使用null合并运算符
<?= $data['content'] ?? '' ?>

// 或者用isset判断
<?= isset($data['content']) ? $data['content'] : '' ?>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:30:53