MVCフレームワークでリクエストをディスパッチしようとしています。現在のURIを定義済みのルートと照合するルーティングオブジェクトがあります。一致する場合は、Routeオブジェクトのインスタンスを返します。そのRouteオブジェクトを介して、一致したコントローラー、メソッド、およびメソッドの引数にアクセスできます。
私はそれをこのように使うことができます:
$route->getClass(); name of controller class to instantiate
$route->getMethod(); name of method to call
$route->getArgs(); array holding arguments that should be passed to method
必要に応じて、新しい引数を追加することもできます。たとえば、依存性注入コンテナと現在のHTTPリクエストオブジェクトインスタンスを次のように引数に追加できます。
$route->addArg('container', $container);
$route->addArg('request', $request);
これで、$ route-> getArgsは、URIからフェッチされたすべての引数だけでなく、$containerインスタンスと$requestインスタンスも保持します。$ containerは、私が書いた依存性注入コンテナーです。また、$ requestは、現在のHTTPリクエストを表すオブジェクトです。
つまり、ルーターをインスタンス化し、現在のルートを取得してから、すべてのメソッド/アクションコントローラー内で使用したいオブジェクトを追加するというアイデアです。次に、そのRouteオブジェクトをDispatcherに渡します。リクエストがディスパッチされると、すべてのメソッド/アクションコントローラーで$ container、$ request、およびその他の引数を使用できるようになります。
私が抱えている問題は、使用するときにブログコントローラーとpostメソッドを言うことです。デフォルトでは、常に、$containerと$requestのインスタンスが必要です(Route :: $ argsにプッシュしたため、ルート定義で定義された、またはURIからフェッチされた他の引数/変数。
したがって、Imがブログコントローラーにいるときは、postメソッドを次のように動作させます。
public function post($container, $request)
{
if($request->isAjax) {
// -- Its ajax request
}
$twig = $container->getService("Twig");
}
私は次のようなリクエストをディスパッチします:
それを機能させるためにcall_user_function_arrayを使用しています:
$app = new $controller();
call_user_function_array(array($app, $method), $args);
これですべて正常に機能しますが、問題が1つあります。そのポストコントローラーを使用する場合、ポストメソッド引数の順序に注意する必要があります。
だから私はこれを行うことができます:
public function post($id, $url, $container, $request) {
// -- SNIP --
}
しかし、私はそれをこのように使うことはできません:
public function post($container, $url, $request, $id) {
/-- SNIP --
}
そのため、問題が発生します。メソッド内で引数を希望どおりに混在させることはできません。これらの引数がRoute:$args配列で定義される順序に注意する必要があります。
すべてのメソッド/アクションコントローラーには、$ request、$ containerインスタンスに加えて、URIを介してフェッチされるか、ルート定義で定義される引数が必要です。
postメソッドが引数を取得する順序を考える必要なしにそれを機能させる方法はありますか?これは参照による受け渡しと関係がありますか?phpは変数を値で渡すので?
call_user_function_arrayを使用していて、call_user_function_arrayの解決策を見つけたいと思っています。これは可能ですか?
そうでない場合、これはReflectionクラスを使用して実行できますか?