0

我有一个网络应用程序,其中同一个对象可以有多个 URL,具体取决于语言环境参数,如下所示:

http://domain.com/{_locale}/{id}/{slug}

我在这些页面上有一个 Like 按钮,效果很好,但问题是在每个语言环境中完成的 Like 都算作一个单独的 OpenGraph 对象,因为 URL 不同。

显而易见的解决方案是使用对象 id 而不仅仅是 Like 按钮的 href 参数,但似乎不可能

基本上,我需要一种方法来让 Like 两者都计算:

http://domain.com/fr/1/some-slug

http://domain.com/en/1/some-slug

因为它们毕竟是同一个对象。

有任何想法吗?

4

1 回答 1

0

我想我必须把它打出来才能弄清楚。这是我对 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>

结果如下hrefhttp://domain.com/fb/profile/1

我发现像这样设置 og:url 元标记很重要:

<meta property="og:url" content="http://domain.com{{ path('profile', {'id': dog.id, 'slug': dog.slug}) }}">

结果如下contenthttp://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 眼中的同一个对象。

于 2013-05-27T00:04:58.523 回答