composer.json需同时配置autoload和require,否则类找不到或依赖不下载;macaw路由注册必须在dispatch前完成;控制器方法须匹配签名且可访问;medoo应单例化避免连接耗尽;macaw仅做基础路由分发。

composer.json 必须配对 autoload 和 require
不配 autoload,composer dump-autoload 就没意义;不写 require,第三方包根本不会下载。很多新手卡在“类找不到”,其实只是 autoload 没生效。
推荐用 PSR-4 映射,比如:
{
"autoload": {
"psr-4": {
"app\controllers\": "app/controllers/",
"app\models\": "app/models/",
"core\": "core/"
}
},
"require": {
"noahbuscher/macaw": "dev-master",
"catfan/medoo": "^2.0",
"league/plates": "^3.4"
}
}
改完立刻执行:composer dump-autoload。别等 composer install 或 update——那俩只管下载依赖,不刷新自动加载映射。
Macaw 路由注册必须在 dispatch() 前完成
Macaw::get()、Macaw::post() 这些调用只是把规则塞进静态数组,真正匹配发生在 Macaw::dispatch() 里。如果路由文件里先写了 dispatch(),后面再加 Macaw::get(),那就永远不生效。
典型错误写法:
Macaw::dispatch();
Macaw::get('/', 'HomeController@index'); // ← 这行永远不会被读到
正确顺序:
- 先
require所有路由定义(含Macaw::get()等) - 再调用
Macaw::dispatch()
控制器方法签名必须匹配路由绑定方式
Macaw 支持两种写法:'HomeController@index' 或 function() { ... }。前者要求类存在、方法可访问、且命名空间与 autoload 一致;后者无限制但难维护。
常见坑点:
-
HomeController类没加namespace appcontrollers;,而composer.json映射的是"app\controllers\"→ 找不到类 - 方法是
private或protected→ Macaw 反射调用失败,报Call to private method - 路由传参如
Macaw::get('user/(:num)', 'UserController@view'),但view()方法没声明参数public function view($id)→ 参数为空或 Notice
Medoo 实例必须全局唯一且配置一次
每次 new Medoo 都会新建数据库连接,高并发下可能耗尽 MySQL 连接数。应该封装成单例,或通过核心类统一管理。
比如在 core/Model.php 中:
namespace core;
use MedooMedoo;
class Model extends Medoo
{
protected static $instance = null;
public static function getInstance()
{
if (self::$instance === null) {
self::$instance = new self([
'type' => 'mysql',
'host' => 'localhost',
'database_name' => 'test',
'username' => 'root',
'password' => '',
'charset' => 'utf8mb4'
]);
}
return self::$instance;
}
}
控制器里就该用 coreModel::getInstance()->select(...),而不是 new Medoo(...)。
最后注意:Macaw 不处理请求体解析(POST JSON)、中间件、CSRF,它只做最简路由分发。真要上线,得自己补这些,或者换更成熟的组件。框架越“简陋”,你写的胶水代码越多——这点容易被文档里一行 composer require 带偏。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











