入门篇 - CRUD 新闻应用

知识库
知识库文档
/tech-stacks/codeigniter/tutorial/入门篇 - CRUD 新闻应用.md

文档

CodeIgniter 4 入门教程:CRUD 新闻应用

1. 背景

CodeIgniter 以轻量和速度著称。本教程带你构建完整的新闻 CRUD 应用,掌握 CI4 的 MVC 模式、模型、查询构建器和表单。

2. 前置概念

概念 说明
Model CodeIgniter\Model,内置 CRUD 方法
Entity 实体对象,属性可自动转换类型
Validation 模型内 $validationRules 定义
Routing 自动/手动路由映射

3. 分步操作

步骤一:创建数据库

CREATE TABLE news (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    slug VARCHAR(255) NOT NULL UNIQUE,
    body TEXT NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

配置 app/Config/Database.php

public $default = [
    'DSN'      => '',
    'hostname' => 'localhost',
    'username' => 'root',
    'password' => '',
    'database' => 'codeigniter_demo',
    'DBDriver' => 'MySQLi',
];

步骤二:创建模型

php spark make:model News

编辑 app/Models/NewsModel.php

<?php

namespace App\Models;

use CodeIgniter\Model;

class NewsModel extends Model
{
    protected $table = 'news';
    protected $primaryKey = 'id';
    protected $useAutoIncrement = true;
    protected $returnType = 'array';
    protected $allowedFields = ['title', 'slug', 'body'];

    protected $useTimestamps = true;
    protected $createdField = 'created_at';
    protected $updatedField = 'updated_at';

    protected $validationRules = [
        'title' => 'required|min_length[3]|max_length[255]',
        'body'  => 'required|min_length[10]',
    ];
}

步骤三:创建控制器

php spark make:controller News
<?php

namespace App\Controllers;

use App\Models\NewsModel;
use CodeIgniter\HTTP\ResponseInterface;

class News extends BaseController
{
    public function index(): string
    {
        $model = new NewsModel();
        $data['news'] = $model->orderBy('id', 'DESC')->findAll();
        return view('news/index', $data);
    }

    public function create(): string
    {
        return view('news/create');
    }

    public function store(): ResponseInterface
    {
        $model = new NewsModel();

        $data = [
            'title' => $this->request->getPost('title'),
            'slug'  => url_title($this->request->getPost('title'), '-', true),
            'body'  => $this->request->getPost('body'),
        ];

        if ($model->insert($data)) {
            return redirect()->to('/news')->with('success', 'News created!');
        }

        return redirect()->back()->withInput()->with('errors', $model->errors());
    }

    public function edit(int $id): string
    {
        $model = new NewsModel();
        $data['news'] = $model->find($id);
        return view('news/edit', $data);
    }

    public function update(int $id): ResponseInterface
    {
        $model = new NewsModel();

        $data = [
            'title' => $this->request->getPost('title'),
            'body'  => $this->request->getPost('body'),
        ];

        $model->update($id, $data);
        return redirect()->to('/news')->with('success', 'Updated!');
    }

    public function delete(int $id): ResponseInterface
    {
        (new NewsModel())->delete($id);
        return redirect()->to('/news')->with('success', 'Deleted!');
    }
}

步骤四:路由

app/Config/Routes.php

$routes->get('news', 'News::index');
$routes->get('news/create', 'News::create');
$routes->post('news', 'News::store');
$routes->get('news/edit/(:num)', 'News::edit/$1');
$routes->post('news/(:num)', 'News::update/$1');
$routes->get('news/delete/(:num)', 'News::delete/$1');

4. 验证

php spark serve

curl -X POST http://localhost:8080/news \
  -d "title=CI4 News&body=CodeIgniter 4 is amazing!"

curl http://localhost:8080/news

5. 思考题

  1. 如何使用 Entity 类为 News 添加 getExcerpt() 方法?
  2. 如何启用 CI4 的自动路由简化路由定义?
  3. 如何为 News 添加分页功能?

信息

路径
/tech-stacks/codeigniter/tutorial/入门篇 - CRUD 新闻应用.md
更新时间
2026/5/31