DI因命名空间而失败

时间:2015-12-03 08:58:18

标签: dependency-injection auryn

我正在关注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 );),但为什么不接受别名?

我希望我的问题有道理。 : - )

1 个答案:

答案 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文档,以便了解别名和其他命令的工作原理。