1

我在一个小项目中使用 Dice(一个不错的 Dependency Injector)。我还在使用 PSR7 Zend Diactoros 来处理请求和 nikic 快速路由。

我使用文档中的示例让 Dice 为 Twig、DB 和我的所有其他类工作,但我无法弄清楚如何使用它将 Request $request 传递给我的控制器。

如果您至少可以为我指出如何正确使用依赖注入器来处理此类用例,我将不胜感激

控制器代码:

use Psr\Http\Message\{ServerRequestInterface,ResponseInterface};

class BaseController
{
    public function index(ServerRequestInterface $request)
    {
        dump($request);
        return view('homepage/index.html');
    }
}

应用程序初始化代码:

$dependency_injector = new Dice();

$rule_request = ['substitutions' => [
    'Psr\\Http\\Message\\ServerRequestInterface' => ['instance'=>function(){
    return Zend\Diactoros\ServerRequestFactory::fromGlobals();
}]];


$midEngine = new MiddlewareEngine($dependency_injector);
$midEngine->add(\App\Middleware\Router::class);

$response = new Zend\Diactoros\Response();
$request = Zend\Diactoros\ServerRequestFactory::fromGlobals();

$final = $midEngine($request, $response);

$emitter = new SapiEmitter();
$emitter->emit($final);
exit;

在路由器代码中:

call_user_func_array([$this->app->di->create($handler[0]),$handler[1]],$vars)

其中 $this->app->di 是 Dice 而 $handler 是

array(2) {
  [0]=>
  string(30) "App\Controllers\BaseController"
  [1]=>
  string(5) "index"
}

1因为我的路由没有参数第一个错误是我传递给几个参数,所以我尝试在路由器中执行此操作,它调用控制器的索引方法并传递 $request

$class = new \ReflectionClass($handler[0]);
$method = $class->getMethod($handler[1]);
foreach ($method->getParameters() as $param) {
            dump($param->getClass()->getName());
            dump($this->app->di->getRule($param->getClass()->getName()));
            $vars[] = $this->app->di->create($param->getClass()->getName());
        }
call_user_func_array([$this->app->di->create($handler[0]),$handler[1]],$vars);

2现在我通过了我的参数,但错误是

Uncaught Error: Cannot instantiate interface Psr\Http\Message\ServerRequestInterface

我有一种感觉,我使用这一切都错了,也许 Di 需要创建,$midEngine因为现在我自己创建了一个响应和请求对象。

任何建议都会很好,我正试图围绕一个迷你框架应该如何围绕一个 Di 旋转。

谢谢,亚历克斯

4

0 回答 0