2

我正在关注本教程以更深入地了解依赖注入。

因为我们的主机仍在 PHP5.3 上,所以我使用Aura\Web -components来进行 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 );),但为什么不接受别名?

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

4

1 回答 1

0

这是 Auryn 的“问题”。如果您阅读他们的文档,您会看到别名的工作方式如下:

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

于 2015-12-03T13:18:34.750 回答