我正在关注this tutorial以更深入地了解依赖注入。
因为我们的主机仍然在PHP5.3上,所以我使用Aura\Web - 组件进行HTTP响应/请求。 使用Auryn\Injector
完成依赖注入到目前为止,我已经设法让项目运行,但我不能将别名用作我在进样器中定义的类名:
$injector = new \Auryn\Injector;
$injector->alias( 'Http\Request', '\Aura\Web\Request' );
$injector->share( '\Aura\Web\Request' );
$injector->define( '\Aura\Web\Request', array(
':client' => new \Aura\Web\Request\Client( $_SERVER ),
':content' => new \Aura\Web\Request\Content( $_SERVER ),
':globals' => new \Aura\Web\Request\Globals(
new \Aura\Web\Request\Values( $_COOKIE ),
new \Aura\Web\Request\Values( $_ENV ),
new \Aura\Web\Request\Files( $_FILES ),
new \Aura\Web\Request\Values( $_POST ),
new \Aura\Web\Request\Values( $_GET ),
new \Aura\Web\Request\Values( $_SERVER )
),
':headers' => new \Aura\Web\Request\Headers( $_SERVER ),
':method' => new \Aura\Web\Request\Method( $_SERVER, $_POST ),
':params' => new \Aura\Web\Request\Params,
':url' => new \Aura\Web\Request\Url( $_SERVER )
)
);
在我的控制器中,我想使用这个别名:
namespace Example\Controllers;
use Http\Request;
class Homepage {
public function __construct( Request $request) { ... }
}
这会引发以下错误:
Could not make \Example\Controllers\Homepage: Class Http\Request does not exist
我可以通过将类声明为:
来解决这个问题namespace Example\Controllers;
use Aura\Web\Request;
class Homepage {
public function __construct( Request $request) { ... }
}
这可能使依赖注入有点......没用? Auryn仍提供正确的参数($action = $injector->make( $action_class );
),但为什么不接受别名?
我希望我的问题有道理。 : - )
答案 0 :(得分:0)
这是一个Auryn"问题"。如果您阅读their docs,则可以看到别名的效果如下:
// Tell the Injector class to inject an instance of V8 any time
// it encounters an Engine type-hint
$injector->alias('Engine', 'V8');
所以它只是将默认实现(类)映射到接口。
现在你正在混合我自己的HTTP库和Aura中的那个,因为Aura \ Web \ Request没有从我的库中实现Http \ Request接口(显然)。
所以你需要做的是输入一个接口或属于Aura库的类的提示。
我建议您阅读Auryn文档,以便了解别名和其他命令的工作原理。