использование Dice — Dependency Injector с Zend Diactoros и Fast Route

Я использую 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');
}
}

Код инициализации приложения:

$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

У меня такое чувство, что я использую все это неправильно, возможно, Ди должен создать $midEngine как сейчас я сам создаю объект ответа и запроса.

Любой совет был бы отличным, я пытаюсь понять, как мини-фреймворк должен вращаться вокруг Di.

Спасибо,
Alex

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]