【发布时间】:2015-07-30 17:54:30
【问题描述】:
我正在使用 symfony 构建一个站点,并使用 Knp Translatable 来处理 Sonata Admin 的多语言管理。但是,可以这么说,我发现自己在一个角落里。我有一个函数来 slugify 一个名字,但 symfony 抛出一个“实体没有字段 slug”但问题是,该字段应该在我的翻译表中。
我已经看过这个了:Knplabs translatable: How to find an entry by a translatable field?
但它没有解决任何问题。
这是我的实体:
<?php
namespace Spec\Bundle\SiteBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Knp\DoctrineBehaviors\Model as ORMBehaviors;
/**
* Artiste
*
* @ORM\Table()
* @ORM\Entity()
*/
class Artiste
{
use ORMBehaviors\Translatable\Translatable;
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="website_url", type="string", length=255, nullable=true)
*/
private $websiteUrl;
/**
getters and setters
**/
public function __call($method, $arguments)
{
return $this->proxyCurrentLocaleTranslation($method, $arguments);
}
}
这是实体翻译
<?php
namespace Spec\Bundle\SiteBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
*/
class ArtisteTranslation
{
use ORMBehaviors\Translatable\Translation;
/**
* @ORM\Column(type="string", length=255)
*/
protected $name;
/**
* @ORM\Column(type="string", length=255)
*/
protected $description;
/**
* @var string
*
* @ORM\Column(name="slug", type="string", length=255)
*/
protected $slug;
/**
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* @param string
* @return null
*/
public function setName($name)
{
$this->name = $name;
}
/**
* @return string
*/
public function getDescription()
{
return $this->description;
}
/**
* @param string
* @return null
*/
public function setDescription($description)
{
$this->description = $description;
}
public function __toString()
{
return $this->getName();
}
public function setSlug($slug){$this->slug = $slug;}
public function getSlug(){return $this->slug;}
}
这里是回购功能:
<?php
namespace Spec\Bundle\SiteBundle\Entity;
use Doctrine\ORM\EntityRepository;
use Knp\DoctrineBehaviors\ORM as ORMBehaviors;
class ArtisteRepository extends EntityRepository
{
public function findOneBySlug($slug){
$qb = $this->createQueryBuilder("a");
$qb
->select("a, t")
->join("a.translations", "t")
->where("t.slug = :slug")
->setParameter("slug", $slug);
return $qb->getQuery()->getOneOrNullResult();
}
}
最后,我是这样调用函数的:
public function prePersist($artiste) {
$helper = $this->container->get("spec.site.helper");
$slugFr = $helper->slugify($artiste->translate("fr")->getName());
$slugEn = $helper->slugify($artiste->translate("en")->getName());
/*
the helper function is :
public function slugify($slug){
$repo = $this->em->getRepository("SpecSiteBundle:Artiste");
$slugToReturn = $repo->findOneBySlug($slug);
return $slugToReturn;
}
*/
$artiste->translate("fr")->setSlug($slugFr);
$artiste->translate("en")->setSlug($slugEn);
$artiste->upload();
}
symfony 给了我这个错误:
Entity 'Spec\Bundle\SiteBundle\Entity\Artiste' has no field 'slug'. You can therefore not call 'findOneBySlug' on the entities' repository
【问题讨论】:
-
我解决了,只是因为我没有在我的实体中指定我的存储库。这是一个新手错误。
标签: symfony localization doctrine