使用Dice - Zend Diactoros和快速路由的依赖注入器

时间:2016-12-14 22:17:14

标签: php dependency-injection psr-7 zend-expressive fastroute

我正在为一个小项目使用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展开。

谢谢, 亚历

0 个答案:

没有答案