gpt4 book ai didi

php - 如何使用 Doctrine 和 Gedmo Translatable Extension 获取不同翻译的对象

转载 作者:搜寻专家 更新时间:2023-10-31 22:01:37 24 4
gpt4 key购买 nike

我遇到了以下问题:我想在不破坏我的 Symfony 应用程序的默认行为的情况下获取特定语言环境的 Doctrine 实体。

这是我的实体之一的示例:

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;

/**
* @ORM\Entity(repositoryClass="ProductRepository")
* @ORM\Table(name="product")
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="discr", type="string")
*/
class Product
{
/**
* @var integer $id
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;

/**
* @var string
* @ORM\Column(name="name", type="string")
* @Gedmo\Translatable
*/
protected $name;

// ...
}

相关 Doctrine 库的一部分:

class ProductRepository extends \Doctrine\ORM\EntityRepository
{
public function findOneProductInLocale($id, $locale)
{
$qb = $this->createQueryBuilder('p')
->select('p')
->where('p.id = :id')
->setMaxResults(1)
->setParameter('id', $id);
;

$query = $qb->getQuery();

$query->setHint(
\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER,
'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'
);

// force Gedmo Translatable to not use current locale
$query->setHint(
\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE,
$locale
);

$query->setHint(
\Gedmo\Translatable\TranslatableListener::HINT_FALLBACK,
1
);

return $query->getOneOrNullResult();
}
}

和我的部分脚本:

// default Locale: en
// request Locale: de
$repo = $em->getRepository('Acme\\Entity\\Product');

$product1 = $repo->findOneById($id);
echo $product1->getName(); // return 'Name (DE)'

$product_de = $repo->findOneProductInLocale($id, 'de');
echo $product_de->getName(); // return 'Name (DE)';

$product_en = $repo->findOneProductInLocale($id, 'en');
echo $product_en->getName(); // return 'Name (EN)'

echo $product1->getName(); // return 'Name (EN)' instead of 'Name (DE)' !! <-- What is wrong?

// even if I refetch a product
$product2 = $repo->findOneById($id);
echo $product2->getName(); // return 'Name (EN)' without taking anymore in account the current locale

现在有人知道为什么这没有按预期工作吗?我的 ProductRepository::findOneProductInLocale() 实现有问题吗?

欢迎任何帮助或提示。

最佳答案

我知道我的回答有点晚了,但我遇到了同样的问题并找到了解决方案。我希望它能帮助其他一些开发人员。

  1. 您的 findOneProductInLocale 如果完全正常。

    它作为设计工作 - 当您将使用 findOneProductInLocale 时,查询将在给定的语言环境中搜索,但最终实体将始终在当前语言环境中加载,您无法更改它。

  2. 通过 findOneProductInLocale 找到实体加载到当前语言环境后,您可以获得所需的语言环境变体通过使用 Gedmo 的 setTranslatableLocale 方法并按照 @umadesign 的说明刷新您的实体

    // Reload the entity in different languages.
    $entity->setTranslatableLocale($locale);
    $em->refresh($entity);
  3. (可选)您可能需要将 setTranslatableLocale 方法和伴随属性 $local 添加到您的可翻译实体

    class Product {
    // ...

    /**
    * @Gedmo\Locale
    * Used locale to override Translation listener`s locale
    * this is not a mapped field of entity metadata, just a simple property
    */
    private $locale;

    /**
    * Set the locale to use for translation listener
    *
    * @param string $locale
    *
    * @return static
    */
    public function setTranslatableLocale($locale) {
    $this->locale = $locale;
    return $this;
    }

    // ...
    }

您可以在 Gedmo documentation under "Basic usage examples" subsection 中找到完整的解释.

关于php - 如何使用 Doctrine 和 Gedmo Translatable Extension 获取不同翻译的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28027356/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com