Я использую 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
Задача ещё не решена.
Других решений пока нет …