Fat-Free 初始化需调用 $f3 = \Base::instance() 并执行 $f3->run(),路由参数通过 $f3->get('PARAMS.id') 或 {{ @id }} 获取,模板输出须设 ESCAPE=true 或用 {{ @var|esc }} 防 XSS,数据库查询用 find()/findOne() 而非 exec()。

怎么初始化 Fat-Free 的核心对象
Fat-Free 没有“安装”概念,直接 require index.php 就能跑,但必须手动创建 F3 实例并启动路由引擎。不调用 run(),所有路由都不会响应——这是新手最常漏掉的一步。
常见错误现象:404 Not Found 或页面空白,但 error_log 里没报错;其实是因为路由注册了,但 run() 没执行。
-
$f3 = \Base::instance();是唯一推荐的初始化方式,别用new Base - 路由定义(如
$f3->route('GET /', ...))必须在$f3->run()之前 - 开发时建议加
$f3->set('DEBUG', 1),否则 500 错误会静默失败
路由写法和参数怎么取才不踩坑
Fat-Free 的路由参数不是自动注入函数形参,而是通过 $f3->get('PARAMS') 或快捷键 @id 在模板/回调中读取——这点和 Laravel/Lumen 完全不同,容易误以为“参数没传进来”。
使用场景:比如 GET /user/@id,想拿到 id 值,不能写 function($id) { ... }。
立即学习“PHP免费学习笔记(深入)”;
- 在匿名函数里用
$f3->get('PARAMS.id')或$f3->get('PARAMS.0')(按顺序) - 在视图里直接用
{{ @id }},前提是路由用了@id占位符 - 正则路由如
GET /post/@id:/[0-9]+/能过滤非法输入,比手动is_numeric()更早拦截 - 注意:URL 中的查询参数(
?page=2)走$f3->get('GET.page'),和PARAMS无关
模板里怎么安全输出变量又不 XSS
Fat-Free 默认不转义变量,{{ @name }} 会原样输出,遇到用户输入就直接 XSS。它没有类似 Twig 的 {{ name|e }} 语法糖,得靠函数包装或配置开关。
性能影响:开启全局转义($f3->set('ESCAPE', true))会让所有 {{ }} 自动 htmlspecialchars,但会略拖慢渲染速度,小型项目可开,高频输出场景建议手动控制。
- 只对特定变量转义:用
{{ @name|esc }},esc是内置过滤器 - 要输出 HTML 片段(如富文本):用
{{ @html|raw }},但务必确保内容可信 - 模板里调用函数如
{{ @user->email()|esc }}是合法的,支持链式调用 - 别依赖前端 JS 去 decode —— 后端该转义就得转义,
ESCAPE设为true是最省心的底线
为什么数据库查询总返回空数组
用 DB\SQL 类查数据时,exec() 返回的是影响行数(INSERT/UPDATE),查数据得用 find() 或 paginate();而 find() 默认返回 ArrayObject,不是普通数组,foreach 能遍历,但 count() 或 empty() 可能行为异常。
兼容性影响:PHP 8.1+ 对 ArrayObject 的 JSON 序列化有变化,直接 json_encode($result) 可能出空对象。
- 查单条:用
$user = $db->findOne('users', 'id=?', [$id]),返回对象或 null - 查多条:用
$list = $db->find('posts', ['status=?', 1]),再iterator_to_array($list)转成标准数组 - 别用
exec('SELECT ...')想拿结果集——它只返回布尔值或影响数 - 连接 MySQL 时,
charset=utf8mb4必须显式写在 DSN 里,否则 emoji 和部分中文存不进库
复杂点在于:Fat-Free 的 DB 层轻量,不提供 Query Builder,写复杂 JOIN 或子查询还是得拼 SQL 字符串,这时候预处理参数(? 占位符)和字段名转义($db->quotekey())就很容易被忽略。











