City
クッキーにパラメータを保存しています。次のように、その値をパターンプレフィックスとしてルーティング構成に含めたいと思います。
# MyBundle/Resources/config/routing.yml
MyBundle_hotel:
resource: "@MyBundle/Resources/config/routing/hotel.yml"
prefix: /%cityNameFromCookie%/hotel
どうすればそれを達成できますか?
難しさはわからないので、これをどのように機能させたいかについてのユースケースを教えてください。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
見つけることもできます。これから、サービスを拡張する方法(サービスがどのように機能するかを学ぶための非常に良い方法)を理解することができます。router
router
それ以外の場合は、サービスを作成する簡単な方法があります。
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);
それでもそれが優れた解決策ではないと思う場合は、ルーターサービスを拡張する必要があります(または、ルーターコンポーネントを拡張して、期待どおりに動作させるためのより良い方法を見つける必要があります)。
私は個人的に上記のメソッドを使用しているので、エンティティをpath
Twigのメソッドに渡すことができます。例は、 services.ymlで定義されているMainServiceクラスとPathExtensionTwigクラスにあります。
Twigでは実行できforum_path('routename', ForumEntity)
、コンテナー対応環境では実行できます$this->container->get('cornichon.forum')->forumPath('routename', ForumEntity)
。
十分な情報に基づいて決定を下すのに十分な情報が必要です