直接 new form 实例,用 addtext() 等方法添加字段,setrequired() 和 addrule() 组合确保非空与格式验证,$form->isvalid() 触发校验,getvalues() 获取 stdclass 对象,依赖 session 实现 csrf 与重放保护。

怎么用 Nette\Forms\Form 创建基础表单
直接 new 一个 Form 实例,加字段、设验证、绑提交逻辑——不是靠 HTML 拼,而是用 PHP 对象描述结构。它自动处理 CSRF、重放保护、值过滤,比手写 $_POST 安全得多。
常见错误是漏掉 setHtmlAttribute('class', '...') 或误以为表单会自动渲染成完整 HTML 页面(其实只生成 <form></form> 内部字段,需要手动 echo 或配合模板)。
- 字段名必须是合法 PHP 变量名(如
$form->addText('email'),不能用'user[email]') - 提交时调用
$form->isValid()才触发验证,不调就不会报错 - 默认不开启 XSRF 保护?错——只要用了
Form类且在 HTTP 上下文中,createTemplate()或render()会自动注入__token隐藏字段
验证规则怎么写才不踩坑:比如邮箱、必填、长度限制
addText('email')->addRule(Form::EMAIL, '请输入有效邮箱') 这种写法看着对,但实际容易漏掉「空值跳过验证」这个默认行为。比如用户没填邮箱,EMAIL 规则根本不会执行,导致空字符串通过。
正确做法是先强制非空,再加格式验证:
$form->addText('email')->setRequired('邮箱不能为空')->addRule(Form::EMAIL, '邮箱格式不对')-
addInteger('age')->addRule(Form::RANGE, '年龄必须在 1~120 之间', [1, 120])—— 注意第三个参数是数组,不是两个独立参数 - 自定义验证函数要用
addRule([$this, 'validateDomain'], '域名不合法'),不能直接写function() { ... }(PHP 7.4+ 虽支持,但 Nette 表单内部序列化会失败)
提交后怎么取值、怎么防止重复提交、怎么保留用户已填内容
表单成功验证后,$form->getValues() 返回的是 stdClass 对象(不是数组),字段名就是属性名。想转数组得显式调用 (array) $form->getValues(),否则 json_encode 会丢数据。
重复提交问题不是靠前端按钮禁用就能解决的——Nette 默认启用「一次有效 token」机制,第二次 POST 同一个 token 会直接抛出 Nette\Application\BadRequestException,错误信息是 Invalid form token。
- 用户填错后刷新页面,表单默认会清空;要保留已填内容,必须在渲染前调用
$form->setDefaults($defaults)(比如从getHttpData()或 session 中恢复) -
getValues('array')是快捷方式,等价于(array) $form->getValues(),但注意它不递归转嵌套对象 - 如果用了
addContainer()做动态字段组,getValues()返回的仍是对象结构,别指望它自动扁平化
CSRF 失败、Invalid form token、模板里 {form myForm} 不生效怎么办
最常被忽略的是 session——Nette Forms 依赖 session 存储 token 和旧值。如果没启动 session(比如 CLI 环境、或 Apache mod_php 下 session.auto_start = 0 且没手动 session_start()),就会一直报 Invalid form token,哪怕表单代码完全正确。
另一个隐形坑是缓存:Nginx / Varnish 如果缓存了含表单的 HTML,用户拿到的是别人生成的 token,必然失效。务必确保表单页不被代理缓存(加 Cache-Control: no-cache)。
- 检查
ini_get('session.save_handler')是否为files或其他可用 handler;Redis session 需确认扩展和配置都就绪 - 模板中
{form myForm}是 Latte 语法,如果用纯 PHP 渲染,得调用$form->render(),而不是 echo$form - 调试时可临时加
dump($form->getErrors())看具体哪条验证炸了,别只盯着 token 错误打转
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











