Aura.Di 避免循环依赖的关键是:服务必须用 set() 闭包注册,禁用直接实例化;依赖通过 lazyGet() 或注入 ContainerInterface 延迟获取;严禁在定义闭包中调用 $container->get()。

Aura.Di 怎么注册服务才能避免循环依赖
Aura.Di 是 Aura 框架的核心容器,但直接 new 实例或用 set() 硬编码依赖,很容易在多层组件间触发 Call to a member function on null 或无限递归。关键不是“怎么注册”,而是“什么时候注册”和“以什么方式解耦”。
- 服务定义必须用
set()的闭包形式,而不是直接传实例 —— 否则容器无法控制初始化时机,__construct()里提前调用未就绪的依赖会崩 - 跨包依赖(比如
Aura\Router\Router依赖Aura\Dispatcher\Dispatcher)别在同一个Container里手动 new,改用newInstance()+lazyNew()延迟实例化 - 避免在服务定义闭包里调用
$container->get('xxx'),这等于把运行时依赖写死进定义逻辑;该用lazyGet()或注入ContainerInterface让使用者自己取
Router 和 Dispatcher 怎么配对才不丢请求参数
Aura\Router\Router 解析路径后,必须把结果准确交给 Aura\Dispatcher\Dispatcher,否则 $request->getAttribute('params') 是空的。这不是配置问题,是数据传递链断裂。
- 路由匹配后必须显式调用
$router->match($request),再把返回的RouteResult传给$dispatcher->dispatch($result);不能跳过match()直接 dispatch 原始 request - Dispatcher 的
__invoke()接收的是RouteResult,不是ServerRequestInterface—— 如果你传错类型,它会静默忽略 params,不会报错 - 自定义 middleware 或 handler 里想读路由参数,得从
$request->getAttribute('route')取RouteResult,再调getAttributes();别试图从$_GET或parsed_body硬扒
怎么让自定义组件被 Aura 自动发现和加载
Aura 不靠自动扫描目录,也不读 composer.json 的 autoload 配置来发现组件。所谓“可复用组件”,前提是它声明了明确的依赖契约,并通过 aura/installer 或手动注册进容器。
- 组件必须提供
Config类(如MyPackage\Config\ContainerConfig),并在其中实现define()方法注册服务 —— 这是 Aura 唯一识别“组件”的方式 - 在主应用的容器初始化时,用
$container->add(new MyPackage\Config\ContainerConfig())才算真正接入;只require包文件没用 - 如果组件用了
aura/di以外的容器(比如 Symfony DI),它和 Aura 容器完全隔离 —— 别指望$container->get('my_service')能跨容器解析
为什么用 Aura.Router 却总 404
不是路由没写对,大概率是 Router 没绑定到 ServerRequest 的 URI 上。Aura.Router 默认不读 $_SERVER['REQUEST_URI'],它只信任传入的 UriInterface 实例。
- 创建
Router后,必须用$router->add('name', '/path')显式添加路由;addCallable()或map()是旧版 API,v3+ 已移除 - 匹配前要确保
$request的getUri()返回的是完整 URI 对象,不是字符串 —— 如果你用Zend\Diactoros\ServerRequestFactory,默认没问题;但手写 request 时忘了 newUri,就会全量 404 - 开发时打开
$router->getMatcher()->getMatches()看实际匹配结果,比查日志更快 —— 它返回数组,包含是否匹配、失败原因(比如 method 不符、host 不符)
松耦合不是靠框架名字撑起来的,是靠每个 set() 里有没有藏着 new,每个 get() 是不是真在需要时才执行,还有——你敢不敢删掉一个组件而不碰其他三个的代码。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











