我想我必须把它打出来才能弄清楚。这是我对 Symfony2 的解决方案。
我让它工作的方式是调整我现有的localeAction
. 默认情况下,它是通过转到网站的根目录触发的,但我对其进行了更改,使其接受路由和参数:
public function localeAction($route = 'home', $parameters = array())
{
$this->getRequest()->setLocale($this->getRequest()->getPreferredLanguage(array('en', 'fr')));
return $this->redirect($this->generateUrl($route, $parameters));
}
然后,我专门为 Facebook 创建了一个路由配置:
facebook_profile:
resource: "@AppCoreBundle/Controller/FacebookController.php"
prefix: /fb
type: annotation
在该控制器中,我通过 id 找到对象,从数据库中获取 slug 并转发到区域设置控制器,该控制器将负责检测用户的区域设置并相应地重定向。
/**
* @Route("/profile/{id}", requirements={"id" = "\d+"}, name="fb-profile")
*/
public function profileAction($id)
{
$dog = $this->getDogManager()->findById($id);
return $this->forward('AppCoreBundle:Core:locale', array(
'route' => 'profile',
'parameters' => array(
'id' => $id,
'slug' => $dog->getSlug(),
),
));
}
最后,视图可以为like按钮使用新路由,如下所示:
<div class="fb-like" data-href="http://domain.com{{ path('fb-profile', {'id': dog.id}) }}" data-send="false" data-layout="button_count" data-width="450" data-show-faces="false"></div>
结果如下href
:http://domain.com/fb/profile/1
我发现像这样设置 og:url 元标记很重要:
<meta property="og:url" content="http://domain.com{{ path('profile', {'id': dog.id, 'slug': dog.slug}) }}">
结果如下content
:http://domain.com/fr/profile/1/some-slug
注意这是真正的 URL,如果我在这里使用 Facebook 路由,调试器会抱怨循环重定向。哦,按钮也不起作用。
我本可以在 Facebook 路由中使用 slug,但如果 slug 出于某种原因发生更改,它将破坏该对象的所有现有 Likes,这显然不是一个理想的副作用。
而已!
http://domain.com/fr/1/some-slug
和
http://domain.com/en/1/some-slug
现在是 Facebook 眼中的同一个对象。