CakePHP

技术栈
后端框架
phprapid-developmentbakeconvention-over-configurationorm

概览

CakePHP\n\nCakePHP 是历史悠久的 PHP 快速开发框架,由 Michal Tatarynowicz 于 2005 年创建。它深受 Ruby on Rails "约定优于配置"理念影响,提供 Bake 脚手架代码生成器,能快速构建 CRUD 应用。\n\n### 核心特性\n\n- Bake CLI:一键生成模型、控制器、视图、测试\n- 约定优于配置:遵循命名约定,减少配置量\n- 强大 ORM:内置 Eloquent 风格查询构建器\n- 模板引擎:原生 PHP 模板,简洁直观\n- 表单 & 验证:安全表单生成 + 丰富验证规则\n- 插件系统:可扩展的模块化架构\n- 安全:CSRF/XSS/SQL 注入防护内置\n- CakePHP 5:全新现代化 PHP 8.1+ 版本

安装

1. 环境准备

  • OS:Linux / macOS / Windows
  • PHP:>= 8.1(CakePHP 5)
  • PHP 扩展:mbstring, intl, simplexml, PDO
  • Composer:最新稳定版
  • 数据库:MySQL 5.7+ / PostgreSQL 10+ / SQLite 3.8+
  • Node.js & npm(可选,前端资源编译)

2. 安装命令

创建项目

composer create-project cakephp/app:5.x my-app
cd my-app

配置数据库

编辑 config/app_local.php

'Datasources' => [
    'default' => [
        'className' => Cake\Database\Connection::class,
        'driver' => Cake\Database\Driver\Mysql::class,
        'host' => 'localhost',
        'username' => 'root',
        'password' => '',
        'database' => 'cake_demo',
        'encoding' => 'utf8mb4',
    ],
],

迁移数据库

bin/cake migrations migrate

启动开发服务器

bin/cake server
# 访问 http://localhost:8765

3. 常见安装问题

缺少 intl 扩展

# Ubuntu/Debian
sudo apt install php8.2-intl

# macOS
brew install php@8.2

权限问题

# Linux/macOS
chmod -R 775 tmp logs

Bake 命令不可用

composer require --dev cakephp/bake

国内镜像

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

示例

Hello World:CakePHP 控制器与 Bake

目标

创建 CakePHP 控制器,展示手动和 Bake 两种方式。

完整代码

1. 手动创建 src/Controller/HelloController.php

<?php

namespace App\Controller;

use Cake\Http\Response;

class HelloController extends AppController
{
    public function initialize(): void
    {
        parent::initialize();
        // 允许未认证访问
        $this->Authentication->allowUnauthenticated(['index', 'greet']);
    }

    public function index(): Response
    {
        $data = [
            'message' => 'Hello, Vibe!',
            'framework' => 'CakePHP',
            'php_version' => PHP_VERSION,
            'timestamp' => date('c'),
        ];

        return $this->response
            ->withType('application/json')
            ->withStringBody(json_encode($data, JSON_PRETTY_PRINT));
    }

    public function greet(string $name): Response
    {
        $data = [
            'message' => "Hello, {$name}!",
            'powered_by' => 'CakePHP',
        ];

        return $this->response
            ->withType('application/json')
            ->withStringBody(json_encode($data));
    }
}

2. 路由(config/routes.php

$routes->scope('/', function (RouteBuilder $builder) {
    $builder->connect('/hello', ['controller' => 'Hello', 'action' => 'index']);
    $builder->connect('/hello/{name}', ['controller' => 'Hello', 'action' => 'greet'])
        ->setPass(['name']);
});

3. 使用 Bake 快速生成(可选)

# 先创建数据库表
bin/cake bake controller Hello
bin/cake bake template Hello

运行步骤

bin/cake server

预期输出

curl http://localhost:8765/hello
# {"message":"Hello, Vibe!","framework":"CakePHP","php_version":"8.2.0","timestamp":"..."}

curl http://localhost:8765/hello/World
# {"message":"Hello, World!","powered_by":"CakePHP"}

教程

CakePHP 入门教程:Blog 应用快速构建

1. 背景

CakePHP 以"约定优于配置"著称,Bake CLI 能在几分钟内生成完整的 Blog 应用。本教程展示 CakePHP 的核心开发体验。

2. 前置概念

概念 说明
Bake CLI 代码生成器,按表结构生成 MVC
命名约定 表名复数(articles)、控制器 ArticlesController
Entity 代表一行数据,含访问器和修改器
Table 数据表对象,含业务逻辑和验证

3. 分步操作

步骤一:创建数据库

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    email VARCHAR(255) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    created DATETIME,
    modified DATETIME
);

CREATE TABLE articles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    title VARCHAR(255) NOT NULL,
    slug VARCHAR(191) NOT NULL UNIQUE,
    body TEXT,
    published BOOLEAN DEFAULT FALSE,
    created DATETIME,
    modified DATETIME,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

步骤二:配置数据库

config/app_local.php 中设置数据库连接信息。

步骤三:Bake 全部代码

# 生成所有表的 Model
bin/cake bake model all

# 生成 Articles 的 CRUD
bin/cake bake controller Articles
bin/cake bake template Articles

# 生成 Users 的 CRUD
bin/cake bake controller Users
bin/cake bake template Users

就这么简单!完整的 Blog 应用已生成。

步骤四:自定义 Model 验证

src/Model/Table/ArticlesTable.php

public function validationDefault(Validator $validator): Validator
{
    $validator
        ->notEmptyString('title', 'Title is required')
        ->minLength('title', 3, 'Title must be at least 3 characters')
        ->maxLength('title', 255)
        ->notEmptyString('body', 'Body is required')
        ->minLength('body', 10);

    return $validator;
}

public function beforeSave(EventInterface $event, EntityInterface $entity, ArrayObject $options)
{
    if ($entity->isNew() && !$entity->slug) {
        $entity->slug = Text::slug($entity->title);
    }
}

步骤五:启动测试

bin/cake server
# 访问 http://localhost:8765/articles

4. 验证

完整 CRUD 页面已可用:

  • GET /articles — 文章列表
  • GET /articles/add — 创建表单
  • GET /articles/view/1 — 文章详情
  • GET /articles/edit/1 — 编辑表单
  • POST /articles/delete/1 — 删除文章

5. 思考题

  1. 如何为 Articles 添加 belongsTo('Users') 关联?
  2. 如何使用 CakePHP 的 Authentication 插件实现登录?
  3. 如何使用 find('published') 自定义查询方法?