如何创建类普通PHP类的CodeIgniter 3控制器并从视图调用
在CodeIgniter 3中实现替代Library的员工控制器
需求说明
我希望创建一个类似如下Employees类的CodeIgniter 3控制器,能够从视图中调用其方法,不想使用Library实现。此前我已通过Library实现了效果,但认为使用控制器是更佳实践,恳请帮助。
原参考类代码:
<?php require_once('database.php'); require_once('employees.php'); require_once('photograph.php'); class employees { protected static $table_name = "employees"; protected static $db_fields = array('idemployee', 'employeenumber', 'name', 'lastname', 'sex', 'phone', 'email'); public $idemployee; public $employeenumber; public $name; public $lastname; public $sex; public $phone; public $email; public function full_name() { if(isset($this->name) && isset($this->lastname)) { return $this->name . " " . $this->lastname; } else { return ""; } } public function employee_detail_card() { $foto = $this->photo(); return "<div class='card' style='width:100%;'> <img class='card-img-top' src='../../public/images_up/$foto' alt='Card image' width='50%'> <div class='card-header'>" . $this->botonesFotoPerfil() . "</div> <div class='card-header card bg-info text-white'> Numero ibo: " . $this->employeenumber . " </div> <div class='card-body'> <table class='table table-striped'> <tr> <tr> <td><strong>Telefono: </strong>" . $this->phone . "</td> </tr> <tr> <td><strong>E-mail: </strong>" . $this->email . "</td> </tr> </table> </div>"; } public function list_employees() { return "<tr>" . "<td>" . $this->employeenumber . "</td>" . "<td>" . $this->full_name() . "</td>" . "<td align='right'>" . $this->phone . "</td> " . "<td align='right'>" . $this->email . "</td> "; } } ?>
实现方案
1. 创建控制器文件
在application/controllers/目录下新建Employees.php,遵循CodeIgniter 3的控制器规范:类名首字母大写,继承CI_Controller,并通过框架自带的数据库类替代手动引入的数据库文件。
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class Employees extends CI_Controller { protected $table_name = "employees"; protected $db_fields = array('idemployee', 'employeenumber', 'name', 'lastname', 'sex', 'phone', 'email'); public function __construct() { parent::__construct(); // 加载框架数据库类 $this->load->database(); } // 生成员工全名 public function full_name($employee) { return isset($employee['name'], $employee['lastname']) ? $employee['name'] . " " . $employee['lastname'] : ""; } // 生成员工详情卡片HTML public function employee_detail_card($employee_id) { // 查询指定员工数据 $query = $this->db->get_where($this->table_name, array('idemployee' => $employee_id)); $employee = $query->row_array(); if(!$employee) return ""; // 获取员工照片(根据实际逻辑调整) $foto = $this->_get_employee_photo($employee_id); // 生成照片操作按钮(根据实际逻辑调整) $action_buttons = $this->_botonesFotoPerfil($employee_id); // 拼接卡片HTML,使用base_url()生成正确资源路径 return "<div class='card' style='width:100%;'> <img class='card-img-top' src='" . base_url("public/images_up/{$foto}") . "' alt='员工照片' width='50%'> <div class='card-header'>{$action_buttons}</div> <div class='card-header card bg-info text-white'> Numero ibo: {$employee['employeenumber']} </div> <div class='card-body'> <table class='table table-striped'> <tr> <td><strong>Telefono: </strong>{$employee['phone']}</td> </tr> <tr> <td><strong>E-mail: </strong>{$employee['email']}</td> </tr> </table> </div> </div>"; } // 生成员工列表行HTML public function list_employees() { // 查询所有员工数据 $query = $this->db->get($this->table_name); $employees = $query->result_array(); $html_rows = ""; foreach($employees as $emp) { $html_rows .= "<tr> <td>{$emp['employeenumber']}</td> <td>{$this->full_name($emp)}</td> <td align='right'>{$emp['phone']}</td> <td align='right'>{$emp['email']}</td> </tr>"; } return $html_rows; } // 私有方法:获取员工照片 private function _get_employee_photo($employee_id) { // 示例:从photograph表查询员工照片,不存在则返回默认图 $query = $this->db->get_where('photograph', array('employee_id' => $employee_id)); $photo = $query->row(); return $photo ? $photo->filename : 'default_avatar.jpg'; } // 私有方法:生成照片操作按钮 private function _botonesFotoPerfil($employee_id) { // 示例:返回上传照片按钮 return "<button class='btn btn-sm btn-primary' data-id='{$employee_id}'>上传照片</button>"; } // 页面入口:员工列表页 public function index() { // 获取生成好的列表HTML,传递给视图 $data['employee_list'] = $this->list_employees(); $this->load->view('employees_list', $data); } // 页面入口:员工详情页 public function view($employee_id) { // 获取生成好的详情卡片HTML,传递给视图 $data['employee_card'] = $this->employee_detail_card($employee_id); $this->load->view('employee_detail', $data); } } ?>
2. 视图中调用控制器生成的内容
员工列表视图(application/views/employees_list.php)
<h2>员工列表</h2> <table class='table table-bordered'> <thead> <tr> <th>员工编号</th> <th>姓名</th> <th>电话</th> <th>邮箱</th> </tr> </thead> <tbody> <?php echo $employee_list; ?> </tbody> </table>
员工详情视图(application/views/employee_detail.php)
<h2>员工详情</h2> <?php echo $employee_card; ?>
3. 优化建议(更符合MVC原则)
虽然上述方案可以直接生成HTML,但更推荐控制器负责获取数据,视图负责渲染HTML,实现业务逻辑与展示层分离:
控制器调整:返回原始数据
// 获取所有员工数据 public function get_employees() { return $this->db->get($this->table_name)->result_array(); } // 获取单个员工数据 public function get_employee($employee_id) { return $this->db->get_where($this->table_name, array('idemployee' => $employee_id))->row_array(); } // 员工列表页入口 public function index() { $data['employees'] = $this->get_employees(); $this->load->view('employees_list', $data); }
视图调整:自行渲染HTML
<!-- employees_list.php --> <h2>员工列表</h2> <table class='table table-bordered'> <thead> <tr> <th>员工编号</th> <th>姓名</th> <th>电话</th> <th>邮箱</th> </tr> </thead> <tbody> <?php foreach($employees as $emp): ?> <tr> <td><?php echo $emp['employeenumber']; ?></td> <td><?php echo $emp['name'] . ' ' . $emp['lastname']; ?></td> <td align='right'><?php echo $emp['phone']; ?></td> <td align='right'><?php echo $emp['email']; ?></td> </tr> <?php endforeach; ?> </tbody> </table>
注意事项
- 确保
application/config/database.php已正确配置数据库连接信息 - 控制器文件名必须与类名一致(首字母大写),否则框架无法加载
base_url()需在application/config/config.php中配置正确的站点URL- 私有方法以
_开头,避免被URL直接访问
内容的提问来源于stack exchange,提问作者jeyglo
相关产品推荐
相关产品推荐

