2

私のコードでは、Symfony Twig Bridge を使用して Twig と統合したい Twig および Symfony ルーティングを使用しています。

私は両方をインストールしており、Symfony\Component\Routing\Generator\UrlGenerator を必要とする Twig 拡張機能 Symfony\Bridge\Twig\Extension\RoutingExtension に追加する必要があります。

UrlGenerator には 2 つの引数が必要です。

  • ルート コレクション
  • リクエストコンテキスト

したがって、私のyamlサービスファイルには次のものがあります。

    router:
    class: Symfony\Component\Routing\Router
    arguments:
        - '@yaml.file.loader'
        - '%routing.file%'
        - { 'cache_dir' : '%cache.dir%' }
        - '@request.context'

    twig:
    class: Twig_Environment
    calls:
        - ['addExtension', ['@twig.extensions.debug']]
        - ['addExtension', ['@twig.extensions.translate']]
        - ['addExtension', ['@twig.extensions.routing']]
    arguments:
        - '@twig.loader'
        - '%twig.options%'

    twig.extensions.routing:
    class: Symfony\Bridge\Twig\Extension\RoutingExtension
    public: false
    arguments:
        - '@twig.url.generator'

そして最後に UrlGenerator:

    twig.url.generator:
    class: Symfony\Component\Routing\Generator\UrlGenerator
    public: false
    arguments:
        - '@router'
        - '@request.context'

残念ながら、@router はルート コレクション タイプではありません。UrlGenerator に必要なデータを取得できるメソッド getRouteCollection があり、拡張機能を手動で追加すると機能します。コントローラーから。しかし、私は異なるファイル間でサービス定義を分割したくなく、それらを yaml サービス定義に保持することを好みます。

問題は、生のオブジェクト Router ではなく、getRouteCollection の結果である UrlGenerator に引数として渡す方法です。

4

1 に答える 1

1

これを行うには複数の方法があります。

Symfony 式言語の使用

Symfony Expression Language コンポーネントがインストールされている場合は、サービス定義でこれを行うことができます。

twig.url.generator:
    class: Symfony\Component\Routing\Generator\UrlGenerator
    public: false
    arguments:
        - "@=service('router').getRouteCollection()"
        - "@request.context"

工場の使用

何らかの理由で Symfony Expression Language を使用したくない場合は、URL ジェネレーターのインスタンス化を担当するファクトリ クラスを使用して行うことができます。

class UrlGeneratorFactory
{
    private $router;

    private $requestContext;

    public function __construct($router, $requestContext)
    {
        $this->router = $router;
        $this->requestContext = $requestContext;
    }

    public function create()
    {
        return new UrlGenerator($this->router->getRouteCollection(), $this->requestContext);
    }
}

そして、yamlでURL ジェネレーターの定義を次のように設定します。

twig.url.generator.factory:
    class: UrlGeneratorFactory
    arguments: ["@router", "@request.context"]

twig.url.generator:
    class:   Symfony\Component\Routing\Generator\UrlGenerator
    factory: ["@twig.url.generator.factory", create]
于 2016-07-13T16:17:03.743 に答える