我在一个小项目中使用 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 旋转。
谢谢,亚历克斯