0

Cityクッキーにパラメータを保存しています。次のように、その値をパターンプレフィックスとしてルーティング構成に含めたいと思います。

# MyBundle/Resources/config/routing.yml

MyBundle_hotel:
    resource: "@MyBundle/Resources/config/routing/hotel.yml"
    prefix:   /%cityNameFromCookie%/hotel

どうすればそれを達成できますか?

4

1 に答える 1

2

難しさはわからないので、これをどのように機能させたいかについてのユースケースを教えてください。generateUrlルートは、関数、url小枝関数、または小枝関数を介して指定できるパラメーターで構成されていますpath

Twigではこれを行うことができます

{{ path('MyBundle_hotel', {cityNameFromCookie: app.request.cookies.get('cityNameFromCookie')}) }}

コントローラーアクションで

$cookieValue = $this->get('request')->cookies->get('cityNameFromCookie');
$url = $this->generateUrl('MyBundle_hotel', array('cityNameFromCookie' => $cookieValue));

または、コンテナにアクセスできる場所から

$cookieValue = $this->container->get('request')->cookies->get('cityNameFromCookie');
$url = $this->container->get('router')->generate('MyBundle_hotel', array('cityNameFromCookie' => $cookieValue));

最後の例では、コンテナへのアクセス方法を変更する必要があります。

複雑さが気になる場合は、このロジックを抽象化してサービス内に配置するか、サービスを拡張できrouterます。

サービスとサービスコンテナに関するドキュメントは、Symfonyのドキュメントにあります。

コマンドを使用してサービスを一覧表示し、サービスとその名前空間をphp app/console container:debug見つけることもできます。これから、サービスを拡張する方法(サービスがどのように機能するかを学ぶための非常に良い方法)を理解することができます。routerrouter

それ以外の場合は、サービスを作成する簡単な方法があります。

services.yml内(バンドル内またはapp / config / config.yml内)

services:
    city:
        class: MyBundle\Service\CityService
        arguments: [@router, @request]

あなたのCityServiceクラスで

namespace MyBundle\Service

class CityService
{

    protected $router;
    protected $request;

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

    public function generateUrl($routeName, $routeParams, $absoluteUrl)
    {
        $cookieValue = $this->request->cookies->get('cityNameFromCookie');

        $routeParams = array_merge($routeParams, array('cityNameFromCookie' => $cookieValue));

        return $this->router->generateUrl($routeName, $routeParams, $absoluteUrl);
    }
}

コンテナにアクセスできる場所ならどこでも、次のことができるようになります

$this->container->get('city')->generateUrl('yourroute', $params);

それでもそれが優れた解決策ではないと思う場合は、ルーターサービスを拡張する必要があります(または、ルーターコンポーネントを拡張して、期待どおりに動作させるためのより良い方法を見つける必要があります)。

私は個人的に上記のメソッドを使用しているので、エンティティをpathTwigのメソッドに渡すことができます。例は、 services.ymlで定義されているMainServiceクラスPathExtensionTwigクラスにあります。

Twigでは実行できforum_path('routename', ForumEntity)、コンテナー対応環境では実行できます$this->container->get('cornichon.forum')->forumPath('routename', ForumEntity)

十分な情報に基づいて決定を下すのに十分な情報が必要です

于 2013-03-25T21:38:11.493 に答える