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

CodeIgniter 4从数据库加载通用配置并传递至视图问题

CodeIgniter数据库配置无法传递到视图的问题解决

配置文件(Config/MyConfig.php)

<?php

namespace Config;

use CodeIgniter\Config\BaseConfig;
use Config\Database;

class MyConfig extends BaseConfig {

    public function __construct() {
        parent::__construct();
        $db = Database::connect();
        $get_configuration = $db->query('SELECT * FROM configuration');
        $this->configuration = $get_configuration->getResult();
        $db->close();
    }

}

原控制器代码(App/Controllers/Home.php)

<?php

namespace App\Controllers;
use App\Controllers\BaseController;
use Config\MyConfig;

class Home extends BaseController {

    public function index() {
        $myconfig = new MyConfig;
        //echo var_dump($myconfig);
        $data = array('value' => $this->data['configuration'][1]->value);
        $this->data['page_title'] = 'Dashboard';
        return view('common/home', $this->data);
        //return view('common/home');
    }

}

原视图代码(views/common/home.php)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title><?php echo ($data['value'][2]); ?> | <?php echo $page_title; ?></title>

  <!-- Google Font: Source Sans Pro -->
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
  <!-- Font Awesome -->
  <link rel="stylesheet" href="assets/plugins/fontawesome-free/css/all.min.css">
  <!-- Theme style -->
  <link rel="stylesheet" href="assets/dist/css/adminlte.min.css">

</head>

<body class="hold-transition sidebar-mini">
    <div class="wrapper">
        <?= $this->include('layouts/header'); ?>
        
        <?= $this->include('layouts/sidebar'); ?>
        
        <!-- Content Wrapper. Contains page content -->
  <div class="content-wrapper">
    <!-- Content Header (Page header) -->
    <section class="content-header">
      <div class="container-fluid">
        <div class="row mb-2">
          <div class="col-sm-6">
            <h1><?php echo $page_title; ?></h1>
          </div>
          <div class="col-sm-6">
            <ol class="breadcrumb float-sm-right">
              <li class="breadcrumb-item"><a href="#">Home</a></li>
              <li class="breadcrumb-item active"><?php echo $page_title; ?></li>
            </ol>
          </div>
        </div>
      </div><!-- /.container-fluid -->
    </section>

    <!-- Main content -->
    <section class="content">

      <!-- Default box -->
      <div class="card">
        <div class="card-header">
          <h3 class="card-title"><?php echo $page_title; ?></h3>
        </div>
        <div class="card-body">
          <?= $this->renderSection('content'); ?>
        </div>
        <!-- /.card-body -->
        <div class="card-footer">
          Footer
        </div>
        <!-- /.card-footer-->
      </div>
      <!-- /.card -->

    </section>
    <!-- /.content -->
  </div>
  <!-- /.content-wrapper -->
<?= $this->include('layouts/footer'); ?>
  <!-- Control Sidebar -->
  <aside class="control-sidebar control-sidebar-dark">
    <!-- Control sidebar content goes here -->
  </aside>
  <!-- /.control-sidebar -->
    </div>

    <!-- jQuery -->
<script src="assets/plugins/jquery/jquery.min.js"></script>
<!-- Bootstrap 4 -->
<script src="assets/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- AdminLTE App -->
<script src="assets/dist/js/adminlte.min.js"></script>  
</body>

</html>

问题分析

  • 控制器错误:创建$myconfig实例后未从该实例获取配置数据,反而访问不存在的$this->data['configuration'];定义的$data数组未合并到$this->data,导致视图收不到value变量。
  • 视图错误:视图中不能用$data['value'],传递的数组键会直接成为视图变量(如$value);$data['value'][2]索引逻辑错误,且若value是单个值,此写法会报错。

修正后的代码

修正后的控制器

<?php

namespace App\Controllers;
use App\Controllers\BaseController;
use Config\MyConfig;

class Home extends BaseController {

    public function index() {
        $myconfig = new MyConfig;
        // 从配置实例获取数据库返回的配置数组
        $configs = $myconfig->configuration;
        
        // 假设取索引为2的配置项作为站点名称
        $siteName = $configs[2]->value;
        
        // 组装视图数据
        $this->data['page_title'] = 'Dashboard';
        $this->data['site_name'] = $siteName;
        
        return view('common/home', $this->data);
    }

}

修正后的视图标题部分

<title><?php echo $site_name; ?> | <?php echo $page_title; ?></title>

额外优化建议

建议在配置类中将查询结果转为键值对数组,避免依赖索引:

// 在MyConfig的__construct中修改
$this->configuration = [];
foreach ($get_configuration->getResult() as $row) {
    // 假设表有name和value字段
    $this->configuration[$row->name] = $row->value;
}

之后控制器可直接用$myconfig->configuration['site_name']获取对应值,更直观可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 01:15:39