我正在为一个小项目使用Dice(一个很好的Dependency Injector)。我也在使用PSR7 Zend Diactoros进行请求和nikic快速路由。
我使用文档中的示例让Dice为Twig,DB和其他所有类工作,但我无法弄清楚如何使用它将Request $请求传递给我的控制器。
如果您至少可以指出我如何正确使用依赖注入器来处理此类用例,我将不胜感激
控制器代码:
use Psr\Http\Message\{ServerRequestInterface,ResponseInterface};
class BaseController
{
public function index(ServerRequestInterface $request)
{
dump($request);
return view('homepage/index.html');
}
}
app init code:
$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 因为我的路线没有param第一个错误是我传递给了几个参数,所以我尝试在路由器中执行此操作,该路由器调用控制器的索引方法并传递$ 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展开。
谢谢, 亚历