私は小さなプロジェクトに Dice(いい依存性インジェクター) を使っています。また、リクエストと nikic 高速ルートに PSR7 Zend Diactoros を使用しています。
ドキュメントの例を使用して、Twig、DB、および残りのすべてのクラスで Dice を動作させましたが、それを使用して 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 を中心に展開する方法について頭を悩ませようとしています。
ありがとう、アレックス