文档
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. 思考题
- 如何使用 Entity 类为 News 添加 getExcerpt() 方法?
- 如何启用 CI4 的自动路由简化路由定义?
- 如何为 News 添加分页功能?