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

如何创建类普通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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:25:13