1

私は小さなプロジェクトに 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 を中心に展開する方法について頭を悩ませようとしています。

ありがとう、アレックス

4

0 に答える 0