规格
Symfony > 4.4.2(不工作) Symfony 4.4.1(工作)
我的翻译有问题,因为在每个包含翻译的操作中,symfony 都会抛出一个错误,例如“在类 'AnredeTranslation' 上找不到映射字段 'sprache_id'”
这对我来说毫无意义,因为该字段在那里并且一直在工作,直到我转到 symfony 4.4 - 他们从 4.3 更改为 4.4 到底是什么让这个错误不断显示?每个带有翻译的实体都包含在这个问题中,所以我的整个项目都被破坏了,除了这个没有翻译的实体。
顺便说一句 - Anrede 是实体,它在 $form->handleRequest 处引发其他实体在 createForm 上引发错误。
有人也遇到了这个问题还是我一个人有这个问题?
更新:
我可以更新到 Symfony 4.4.1 - 从 Symfony 4.4.2 这个错误(没有字段 sprache_id 的映射......)将被抛出带有翻译的 create/mod 实体,我不知道为什么。只有错误让我感到困惑,因为表单/请求处理程序搜索 sprache_id 字段但该字段只是 sprache。
例子
我现在将在这里发布一个实体(最短的)来显示我的定义
安瑞德实体
<?php
namespace App\Entity\Core\Kontakt;
use App\Entity\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity(repositoryClass="App\Repository\Core\Benutzer\AnredeRepository")
*/
class Anrede extends Entity
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="boolean")
*/
private $aktiv;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Core\Kontakt\AnredeTranslation", mappedBy="anrede", orphanRemoval=true, cascade={"persist","remove","merge"}, fetch="EAGER", indexBy="sprache_id")
* @ORM\OrderBy({"sprache" = "ASC"})
* @Assert\Valid()
*/
private $translations;
/**
* @ORM\Column(type="boolean", options={"default":0})
*/
private $standard;
public function __construct()
{
$this->translations = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getAktiv(): ?bool
{
return $this->aktiv;
}
public function setAktiv(bool $aktiv): self
{
$this->aktiv = $aktiv;
return $this;
}
/**
* @return Collection|AnredeTranslation[]
*/
public function getTranslations(): Collection
{
return $this->translations;
}
public function addTranslation(AnredeTranslation $translation): self
{
if (!$this->translations->contains($translation)) {
$this->translations[] = $translation;
$translation->setAnrede($this);
}
return $this;
}
public function removeTranslation(AnredeTranslation $translation): self
{
if ($this->translations->contains($translation)) {
$this->translations->removeElement($translation);
// set the owning side to null (unless already changed)
if ($translation->getAnrede() === $this) {
$translation->setAnrede(null);
}
}
return $this;
}
public function getStandard(): ?bool
{
return $this->standard;
}
public function setStandard(bool $standard): self
{
$this->standard = $standard;
return $this;
}
}
Anrede翻译实体
<?php
namespace App\Entity\Core\Kontakt;
use App\Entity\Core\Sprache\Sprache;
use App\Entity\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity(repositoryClass="App\Repository\Core\Benutzer\AnredeTranslationRepository")
* @UniqueEntity(
* fields={"sprache","anrede"},
* errorPath="sprache",
* message="error.bereits_vorhanden"
* )
*/
class AnredeTranslation extends Entity
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Core\Kontakt\Anrede", inversedBy="translations")
* @ORM\JoinColumn(nullable=false)
*/
private $anrede;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Core\Sprache\Sprache")
* @ORM\JoinColumn(nullable=false)
* @Assert\NotNull()
*/
private $sprache;
/**
* @ORM\Column(type="string", length=255)
* @Assert\NotBlank()
*/
private $name;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $anredetext;
public function getId(): ?int
{
return $this->id;
}
public function getAnrede(): ?Anrede
{
return $this->anrede;
}
public function setAnrede(?Anrede $anrede): self
{
$this->anrede = $anrede;
return $this;
}
public function getSprache(): ?Sprache
{
return $this->sprache;
}
public function setSprache(?Sprache $sprache): self
{
$this->sprache = $sprache;
return $this;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(?string $name): self
{
$this->name = $name;
return $this;
}
public function getAnredetext(): ?string
{
return $this->anredetext;
}
public function setAnredetext(?string $anredetext): self
{
$this->anredetext = $anredetext;
return $this;
}
}
AnredeType
<?php
namespace App\Form\Core\Kontakte;
use App\Entity\Core\Kontakt\Anrede;
use App\Form\Type\SwitchType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class AnredeType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('aktiv', SwitchType::class, [
'label' => 'aktiv.name',
'help'=> 'aktiv.help'
])
->add('standard', SwitchType::class, [
'label' => 'standard.name',
'help'=> 'standard.help'
])
->add('translations', CollectionType::class, [
'label' => 'sprachen.name',
'entry_type' => AnredeTranslationType::class,
'error_bubbling' => true,
'prototype' => true,
'allow_add' => true,
'allow_delete' => true,
])
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Anrede::class,
]);
}
}
AnredeTranslationType
<?php
namespace App\Form\Core\Kontakte;
use App\Entity\Core\Kontakt\Anrede;
use App\Entity\Core\Kontakt\AnredeTranslation;
use App\Entity\Core\Navigation\Navigation;
use App\Entity\Core\Navigation\NavigationTranslation;
use App\Entity\Core\Sprache\Sprache;
use App\Form\Transform\HiddenTransformer;
use App\Form\Type\SprachenType;
use App\Services\LocaleService;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Translation\Translator;
use Symfony\Component\Translation\TranslatorInterface;
class AnredeTranslationType extends AbstractType
{
/**
* @var EntityManagerInterface
*/
private $manager;
/**
* @var Translator
*/
private $translator;
/**
* @var LocaleService
*/
private $localeService;
public function __construct(EntityManagerInterface $manager, TranslatorInterface $translator, LocaleService $localeService)
{
$this->manager = $manager;
$this->translator = $translator;
$this->localeService = $localeService;
}
private $options;
public function buildForm(FormBuilderInterface $builder, array $options)
{
$this->options = $options;
$builder
->add('sprache', SprachenType::class, [
'required' => true,
])
->add('name', TextType::class, [
'required' => true,
'label' => 'label.name',
'help' => 'help.name'
])
->add('anredetext', TextType::class, [
'required' => false,
'label' => 'anredetext.name',
'help' => 'anredetext.help',
])
->add('anrede', HiddenType::class)
;
$builder->get('anrede')->addModelTransformer(new HiddenTransformer($this->manager, Anrede::class));
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => AnredeTranslation::class,
]);
}
}