Symfony 4: Как редактировать объект и связанный объект с отношением один к одному - PullRequest
0 голосов
/ 15 марта 2020

У меня есть две сущности (page и slug) с однонаправленным отношением один к одному.

Проблема возникает, когда я оставляю поле slug пустым, потому что я хочу обновить объект Slug по заголовку, если он пуст.

Ошибка: ожидаемый аргумент типа «строка», «ноль» указан в пути к свойству «имя».

Вот мой код.

МОЙ КОНТРОЛЛЕР:

public function edit(Page $page, Request $request, EntityManagerInterface $entityManager)
    {
        $form = $this->createForm(PageType::class, $page);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $entityManager->flush();
            $this->addFlash(
                'success',
                "Page  <strong>{$page->getTitle()}</strong> Updated successfully. "
            );
            return $this->redirectToRoute("backoffice_page_edit", ["id" => $page->getId()]);
        }
        return $this->render('back_office/page/edit.html.twig', [
            'form' => $form->createView(),
        ]);
    }

СТРАНИЦА СУЩЕСТВА:

class Page extends EntityBase
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

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

    /**
     * @ORM\Column(type="text")
     */
    private $content;

    /**
     * @ORM\Column(type="boolean")
     */
    private $status;

    /**
     * @ORM\OneToOne(targetEntity="App\Entity\Slug", inversedBy="page", cascade={"persist", "remove"})
     * @ORM\JoinColumn(nullable=false)
     * @Assert\Valid
     */
    private $slug;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getTitle(): ?string
    {
        return $this->title;
    }

    public function setTitle(string $title): self
    {
        $this->title = $title;

        return $this;
    }

    public function getContent(): ?string
    {
        return $this->content;
    }

    public function setContent(string $content): self
    {
        $this->content = $content;

        return $this;
    }

    public function getStatus(): ?bool
    {
        return $this->status;
    }

    public function setStatus(bool $status): self
    {
        $this->status = $status;

        return $this;
    }

    public function getSlug(): ?Slug
    {

        return $this->slug;
    }

    public function setSlug(Slug $slug): self
    {

        $this->slug = $slug;
        return $this;
    }
    /**
     * Set the Slug object by title if it is empty
     * @ORM\PrePersist
     * @ORM\PreUpdate
     */
    public function setSlugByTitle(): void
    {
        if (null === $this->getSlug()) {
            $slug = new Slug();
            $slug->setName($this->getTitle());
            $this->setSlug($slug);
        }

    }
}

Слот ENTITY:

class Slug  extends EntityBase
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

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

    /**
     * @ORM\OneToOne(targetEntity="App\Entity\Page", mappedBy="slug", cascade={"persist", "remove"})
     */
    private $page;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    public function getPage(): ?Page
    {
        return $this->page;
    }

    public function setPage(Page $page): self
    {
        $this->page = $page;

        // set the owning side of the relation if necessary
        if ($page->getSlug() !== $this) {
            $page->setSlug($this);
        }

        return $this;
    }

    /**
     * @ORM\PreUpdate()
     * @ORM\PrePersist()
     */
    public function initializeSlug()
    {
        $slugify = new Slugify();
        $this->name = $slugify->slugify($this->name);
    }
}


СТРАНИЦА ФОРМЫ:

class PageType extends ApplicationType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title', TextType::class, $this->getConfiguration("Title", "Type a title for this page"))
            ->add('slug', SlugType::class, $this->getConfiguration(false, false, [
                'required' => false,
            ]))
            ->add('content', CKEditorType::class, $this->getConfiguration("Content", ""))
            ->add('status', CheckboxType::class, $this->getConfiguration("Published", "", [
                'attr' => ['checked' => 'checked'],
                'required' => false,
            ]));
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Page::class,
        ]);
    }
}

ФОРМА Slug:

class SlugType extends ApplicationType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class, $this->getConfiguration("Slug", "Type a slug valid for this page"));
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Slug::class,
        ]);
    }
}
...