0

最近、Silex でのリクエスト転送に関する投稿を書きました。この記事では、ブログの例を使用して、Silex でのサブ リクエストについて説明しました。

ドメイン コントローラー用に、この例を少し変更したバージョンを使用します。ドメイン エンドポイントへのパス = /product/domain

ドメインには、Web ホスティング パッケージを添付することもできます。このエンドポイントの URL パスは /product/domain/(id)/webhosting/ になります。

URL パスを使用して、Web ホスティング パッケージに関する情報を取得できます。このエンドポイントの URL パスは、/product/domain/(id)/webhosting/(id) になります。

これらのサブ リクエストを処理するために、メソッド シグネチャにパラメータを持たない forwardRequest というメソッドがありますが、動的に保つために func_get_args を使用します。

残念ながら、Silex はルート内の名前付きパラメーターを使用してメソッドを呼び出すため、これは機能しません。したがって、/product/domain/domain_id/webhosting/webhosting_id がある場合、メソッドには method($domain_id, $webhosting_id) の署名が必要です。これは、1 つのメソッドで複数のエンドポイントを転送する場合の PITA です。追加の /product/domain/domain_id/emailhosting および /product/domain/domain_id/dns エンドポイントがある場合は、リクエストを転送するためにそれぞれのメソッドを作成する必要があります。

これらすべてのサブリクエストを転送するために1つのメソッドのみを使用できるソリューションはありますか?

注: PHP 5.3 を使用しています。

4

1 に答える 1

2

コントローラに渡す引数を決定する silex の部分は、「コントローラ リゾルバ」と呼ばれます。デフォルトのコントローラー リゾルバーはリフレクションを使用します。controller_resolverただし、カスタム実装でサービスをオーバーライドできます。

既存のものをラップするが引数を単一のものに置き換えるカスタムコントローラーリゾルバーを定義すると、リクエストは次のようになります。

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;

class RequestArgumentControllerResolver implements ControllerResolverInterface
{
    protected $resolver;

    public function __construct(ControllerResolverInterface $resolver)
    {
        $this->resolver = $resolver;
    }

    public function getController(Request $request)
    {
        return $this->resolver->getController($request, $controller);
    }

    public function getArguments(Request $request, $controller)
    {
        return [$request];
    }
}

新しく定義されたデコレーターで既存のコントローラー リゾルバーを拡張します。

$app['controller_resolver'] = $app->share($app->extend('controller_resolver', function ($resolver, $app) {
    return new RequestArgumentControllerResolver($resolver);
}));

注: これは 1 つの方法にすぎません。飾る必要はありません。お好みでレゾルバを丸ごと交換することもできます。そして明らかに、これは単一の引数をコントローラーに渡すだけの非常に基本的な例にすぎません。もっと洗練されたことができます。

于 2013-11-04T12:11:18.383 に答える