【问题标题】:How to return a localized property of an entity in Symfony 2如何在 Symfony 2 中返回实体的本地化属性
【发布时间】:2013-07-07 19:54:35
【问题描述】:

我有一个“类别”实体包含

/**
 * @ORM\Column(type="string", length=255)
 */
protected $nameFr;

/**
 * @ORM\Column(type="string", length=255)
 */
protected $nameEn;

现在,我正在尝试在视图中显示本地化名称,我可以使用以下方法显示一个或另一个:

{{ categories.nameFr }} and {{ categories.nameEn }}

所以我创建了一个名为getName() 的方法,这样我就可以使用{{ categories.name }}

我只需要访问语言环境,因此我使用 setter 和 getter 向实体添加了一个 protected $locale 属性,并在调用视图之前设置了语言环境(顺便说一下,我使用 @Template 进行返回):

$locale = $this->getRequest()->getLocale();
$categories->setLocale($locale);

return array(
    'categories' => $categories
);

这是可行的,但现在我实现了一个分页包KnpLabs/KnpPaginatorBundle,它需要发送查询而不是实体:

$em = $this->getDoctrine()->getManager();

$categoriesQuery = $em->createQueryBuilder()
    ->select('category')
    ->from('OylexCategoryBundle:Category', 'category')
;

$locale = $this->getRequest()->getLocale();

$categoriesQuery->setLocale($locale);

$paginator  = $this->get('knp_paginator');
$categoriesPagination = $paginator->paginate(
    $categoriesQuery,
    $this->get('request')->query->get('page', 1),
    30
);

return array(
    'categoriesPagination' => $categoriesPagination
);

此操作失败并显示错误消息:FatalErrorException: Error: Call to undefined method Doctrine\ORM\QueryBuilder::setLocale()

如果我尝试在 $categoriesPagination 上使用 setLocale() 方法,则会失败并显示错误消息:FatalErrorException: Error: Call to undefined method Knp\Bundle\PaginatorBundle\Pagination\SlidingPagination::setLocale()

有没有办法将语言环境传递给实体?或者有没有更好的方法来处理这种情况?

谢谢,

【问题讨论】:

    标签: php symfony orm doctrine-orm entities


    【解决方案1】:

    一般来说,你不应该做类似propertyEnpropertyFr 的事情。

    只需将您的翻译与语言环境属性一起存储,这使得在查询中从数据库中获取它们非常简单:

    // example findByLocale($locale) method
    
    ->select('entity.property')
    ->from('AcmeMyBundle:Entity', 'entity')   
    // or inside a repository $this->createQueryBuilder('entity')
    
    ->where('entity.locale = :locale')
    ->setParameter('locale', $locale)
    

    不过这都是以前做过的……

    您应该使用Gemo\DoctrineExtensions\Translatable,它可以使用Stof\DoctrineExtensionsBundle轻松与symfony2集成

    ...如果使用带有可用特征的 PHP 5.4+,或者我的提示KnpLabs\DoctrineBehaviors\Translatable

    为了将这些与您的表单很好地集成,请使用a2lix\TranslationFormBundle

    请参阅 my answer here 快速了解如何使用 DoctrineBehaviors\Translatable 和当前的语言环境代理,我发现这是一个非常舒适的解决方案。

    只需创建类EntityEntityTranslation,包括代理行...调用$entity->getProperty()

    -> 自动应用当前语言环境。尽可能简单:-)

    【讨论】:

    • 谢谢,我选择了 traits 方法并且它正在工作,但现在我尝试使用已翻译的字段作为表单实体字段类型的属性:'property' => 'name' 我收到错误:“两个属性都没有"name" 或方法 "getName()" 或方法 "isName()" 存在于类中",我尝试使用 query_builder 选项,但它说实体没有名为 locale 的字段或关联,我想我必须加入EntityTranslation,我来看看怎么做,是这个方法还是有更好的方法?
    • 更新:我用 query_builder 选项尝试了一些东西,无论我做什么,“name”都不是属性选项的有效值,但我可以调用 getName();exit;在 query_builder 闭包中它可以工作,它永远不会离开闭包
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多