symfony2 でプライベート Web サイトを提供する SaaS を作成しています。私がやろうとしているのは、人々がこの方法でウェブサイトにアクセスできるようにすることです:
http://www.mydomain.com/w/ {website_name}
私が使用しているルーティング構成は次のとおりです。
websites:
resource: "@MyBundle/Resources/config/routing.yml"
prefix: /w/{website_name}
問題は、たとえばhttp://www.mydomain.com/w/chucknorrisにアクセスしようとすると、エラーが発生することです。
「MyBundle:Publication:publicationsList.html.twig」で、テンプレートのレンダリング中に例外がスローされました (「ルート「websites_homepage」の URL を生成するためのいくつかの必須パラメーター (「website_name」) が欠落しています。」)。
私が理解したのは、ルート構成がうまく機能していることですが、ルーターを呼び出して Web サイトで URL を生成するときに、「コンテキスト」{website_name} URL パラメーターを認識していないということです。
私が想像した 1 つの解決策は、このパラメーターがコンテキストで設定されたときに、このパラメーターを自動的に、そしてさりげなく挿入する方法を見つけることです。
今まで私ができたのは、この方法でこのパラメーターを取得するサービスを作成することだけです:
public function __construct(Registry $doctrine, ContainerInterface $container) {
$website_name = $container->get('request')->get("website_name");
if (!empty($website_name)) {
$repository = $doctrine->getManager()->getRepository('MyBundle:website');
$website = $repository->findOneByDomain($website_name);
if ($website) {
$this->website = $website;
} else {
throw new \Symfony\Component\HttpKernel\Exception\NotFoundHttpException();
}
} else {
$this->isPortal = true;
}
}
私の質問は次のとおりです:コントローラーまたは小枝でルーターを呼び出すたびにパラメーターが見つからないというエラーを回避し、手動で指定する必要なく、生成されたすべてのURLにその引数を挿入するにはどうすればよいですか? (リクエストイベントに関するものだと思いますが、それを行う方法、特にsymfony2の適切な使用法に従って行う方法についての手がかりがありません)
更新 symfony が提供する locallistener に基づいて作成したリスナーは次のとおりです。
<?php
class WebsiteNameRouteEventListener implements EventSubscriberInterface {
private $router;
public function __construct(RequestContextAwareInterface $router = null) {
$this->router = $router;
}
public function onKernelResponse(FilterResponseEvent $event) {
$request = $event->getRequest();
$this->setWebsiteName($request);
}
public function onKernelRequest(GetResponseEvent $event) {
$request = $event->getRequest();
$this->setWebsiteName($request);
}
public static function getSubscribedEvents() {
return array(
// must be registered after the Router to have access to the _locale
KernelEvents::REQUEST => array(array('onKernelRequest', 16)),
KernelEvents::RESPONSE => 'onKernelResponse',
);
}
private function setWebsiteName(Request $request) {
if (null !== $this->router) {
echo "NEW CODE IN ACTION";die();
$this->router->getContext()->setParameter('website_name', $request->attributes->get("website_name"));
}
}
}
しかし、私はまだこのエラーが発生しています:
「MyBundle:Publication:publicationsList.html.twig」で、テンプレートのレンダリング中に例外がスローされました (「ルート「ホームページ」の URL を生成するためのいくつかの必須パラメーター (「website_name」) が欠落しています。」)。500 内部サーバー エラー - Twig_Error_Runtime 1 リンクされた例外:
MissingMandatoryParametersException »
私のエコーなしで「....」; die() が実行されているので、小枝が path(routename) コードを実行するときにリッスンしているイベントを発生させていないと思います。
何か案が ?