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
相关产品推荐
相关产品推荐

