3

规格

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,
        ]);
    }
}

4

0 回答 0