够,但默认生成的代码不能直接上线——它只覆盖最基础的增删改查逻辑,没权限、没表单验证、没关联数据处理,连分页都得手动开。

用 CakePHP4 生成 CRUD 控制器和模板,一条命令够不够?
够,但默认生成的代码不能直接上线——它只覆盖最基础的增删改查逻辑,没权限、没表单验证、没关联数据处理,连分页都得手动开。
-
bin/cake bake controller Articles --prefix Admin:加--prefix Admin才会进src/Controller/Admin/,漏了就生成到默认目录,后面路由全错 -
bin/cake bake template Articles默认只生成 index/add/edit/view,缺 delete 确认页,得自己补delete.php模板,否则confirmDelete()调用会报MissingTemplateException - 生成的
add()和edit()方法没调用$this->Articles->patchEntity()的accessibleFields限制,如果模型里没设$_accessible = ['*' => false],批量赋值漏洞就开着
FormHelper 提交后数据不入库?检查这三处硬编码
常见现象是表单看着提交成功,但数据库没新增记录,日志也没报错——大概率卡在实体层过滤或验证失败,但页面没显示错误提示。
- 控制器里必须显式调用
$this->request->getData()并传给newEmptyEntity()或patchEntity(),光写$this->Articles->newEntity()不行,因为没把请求数据塞进去 -
src/Template/Admin/Articles/add.php里$this->Form->create($article)的$article变量要是空实体($this->Articles->newEmptyEntity()),不是null,否则表单字段名解析失败,提交的数据键名对不上 - 模型里
validationDefault()方法如果写了$validator->requirePresence('title')却没配$validator->allowEmptyString('title', null, 'create'),新建时没填标题就会静默失败($entity->getErrors()有内容,但模板没读取)
路由配成 /admin/articles 却 404?别只改 config/routes.php
404 不一定是路由没配,更可能是中间件或命名空间没对上。
- 确保
config/routes.php里用了$routes->prefix('Admin', function ($routes) { ... }),而不是手写$routes->connect('/admin/articles', [...])—— 后者绕过前缀自动加载机制,控制器类不会按Admin\ArticlesController去找 - 控制器文件必须放在
src/Controller/Admin/ArticlesController.php,类名必须是class ArticlesController extends AppController,少一个Admin\命名空间,Dispatcher 就找不到 - 如果用了
Authentication中间件,检查src/Controller/Admin/AppController.php是否继承了带认证配置的基类,否则未登录访问直接跳 401,浏览器可能缓存成 404
列表页要关联查询(比如文章+作者名),contain() 放哪最合适?
放动作方法里临时写,短期快;放表类的 find('all') 默认选项里,长期稳——但别放错位置,不然 N+1 或查不到数据。
- 在
src/Model/Table/ArticlesTable.php的initialize()里加$this->belongsTo('Authors');,这是关联定义前提,漏了contain()直接无效 - 想让所有
index都带作者,就在ArticlesTable里覆写find('all')方法,里面调->contain(['Authors']);如果只某几个动作需要,就在控制器的index()里用$this->Articles->find()->contain(['Authors'])->all() - 模板里读作者名必须用
$article->author->name,不是$article->author_name——CakePHP 不自动扁平化关联字段,字段名还是嵌套对象结构
关联数据默认不缓存,列表页每行都查一次作者,性能会掉。真要压测,得配 Cache 层或改用 select() + leftJoin() 手动拼 SQL,但那就脱离 bake 的初衷了。
立即学习“PHP免费学习笔记(深入)”;



















