Ошибка Symfony может использовать «выход из» только с массивами

#php #forms #symfony #doctrine-orm

#php #формы #symfony #doctrine-orm

Вопрос:

Я создаю веб-сайт с помощью Symfony 5. У меня есть проблема, которую я не могу решить. Мне нужно иметь возможность создавать сущности, и для этого я хочу использовать форму, сгенерированную Symfony.

Symfony отправляет мне эту ошибку:

Может использовать «выход из» только с массивами и проходимыми объектами, если я что-то изменяю в своей сущности «Entities», тогда symfony отправляет меня обратно:

Мое поле, которое я ждал

Отлично, это именно то, что мне нужно, но проблема в том, что если я обновлю страницу, ошибка вернется.

 <?php 
namespace AppControllerAdmin;

use AppEntityEntities;
use AppEntityEvents;
use AppFormEntitiesType;
use AppFormEventsType;
use AppRepositoryCriteriasRepository;
use AppRepositoryEntitiesRepository;
use AppRepositoryEventsRepository;
use DoctrinePersistenceObjectManager;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAnnotationRoute;


Class AdminHome extends AbstractController {

    protected $event;
    protected $entity;
    protected $criteria;
    protected $twig;

    public function __construct(EventsRepository $event, EntitiesRepository $entity, CriteriasRepository $criteria, ObjectManager $em)
    {
        $this->event = $event;
        $this->entity = $entity;
        $this->criteria = $criteria;
        $this->em = $em;
    }


    public function index(){

        $event = $this->event->findOneBy(['current' => 1]);
        $criterias = $this->indexCriteria($event);
        $entities = $this->indexEntity($event);

        return new Response($this->render('admin/home.html',[ 'event' => $event, 'entities' => $entities, 'criterias' => $criterias ]));
    }


    public function indexEntity(Events  $event){

        return $event->getEntity();
    }
    
    public function indexCriteria(Events  $event){
        
        return  $event->getCriterias();
    }

    /**
     * @Route("/admin/event/create", name="admin.event.new")
     */
    public function newEvent(Request $request){
        $event = new Events();
        $form = $this->createForm(EventsType::class, $event);
        $form->handleRequest($request);
        if($form->isSubmitted() amp;amp; $form->isValid()){
            $this->em->persist($event);
            $this->em->flush();
            return $this->redirectToRoute('adminHome');
        }
        return $this->render('admin/event/eventNew.html', ['event' => $event, 'form' => $form->createView()]);
    }
    
    /**
     * @Route("/admin/entity/create", name="admin.entity.new")
     */
    public function newEntity(Request $request){
        $entity = new Entities();
        $form = $this->createForm(EntitiesType::class, $entity);
        $form->handleRequest($request);
        if($form->isSubmitted() amp;amp; $form->isValid()){
            $this->em->persist($entity);
            $this->em->flush();
            return $this->redirectToRoute('adminHome');
        }
        return $this->render('admin/entity/entityNew.html', ['entity' => $entity, 'form' => $form->createView()]);

    }

    // /**
    //  * @Route("/admin/entity/edit", name="admin.entity.edit")
    //  */
    // public function editEntity(Entities $entity, Request $request){
    //     $form = $this->createForm(EntityType::class, $entity);
    //     $form->handleRequest($request);

    //     if($form->isSubmitted() amp;amp; $form->isValid()){
    //         $this->em->flush();
    //         return $this->redirectToRoute('adminHome');
    //     }
    //     return $this->render('admin/entityEdit.html', ['entity' => $entity, 'form' => $form->createView()]);
    // }
}
?>

 
 <?php

namespace AppEntity;


use DoctrineCommonCollectionsArrayCollection;
use DoctrineCommonCollectionsCollection;
use DoctrineORMMapping as ORM;

/**
* @ORMEntity(repositoryClass=EntitiesRepository::class)
*/
class Entities
{
   /**
    * @ORMId
    * @ORMGeneratedValue
    * @ORMColumn(type="integer")
    */
   private $id;

   /**
    * @ORMColumn(type="string", length=255)
    */
   private $entityName;

   /**
    * @ORMOneToMany(targetEntity=Rates::class, mappedBy="entity")
    */
   private $rates;

   /**
    * @ORMManyToMany(targetEntity=Events::class, mappedBy="entity")
    */
   private $event;

   /**
    * @ORMColumn(type="string", length=255)
    */
   private $descriptionFr;

   /**
    * @ORMColumn(type="string", length=255, nullable=true)
    */
   private $descriptionEn;

   /**
    * @ORMManyToMany(targetEntity=Themes::class, inversedBy="entities")
    */
   private $theme;


   public function __construct()
   {
       $this->rates = new ArrayCollection();
       $this->event = new ArrayCollection();
       $this->theme = new ArrayCollection();
   }

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

   public function getEntityName(): ?string
   {
       return $this->entityName;
   }

   public function setEntityName(string $entityName): self
   {
       $this->entityName = $entityName;

       return $this;
   }

   /**
    * @return Collection|Rates[]
    */
   public function getRates(): Collection
   {
       return $this->rates;
   }

   public function addRate(Rates $rate): self
   {
       if (!$this->rates->contains($rate)) {
           $this->rates[] = $rate;
           $rate->setEntity($this);
       }

       return $this;
   }

   public function removeRate(Rates $rate): self
   {
       if ($this->rates->removeElement($rate)) {
           // set the owning side to null (unless already changed)
           if ($rate->getEntity() === $this) {
               $rate->setEntity(null);
           }
       }

       return $this;
   }

   /**
    * @return Collection|Events[]
    */
   public function getEvent(): Collection
   {
       return $this->event;
   }

   public function addEvent(Events $event): self
   {
       if (!$this->event->contains($event)) {
           $this->event[] = $event;
           $event->addEntity($this);
       }

       return $this;
   }

   public function removeEvent(Events $event): self
   {
       if ($this->event->removeElement($event)) {
           $event->removeEntity($this);
       }

       return $this;
   }

   public function getDescriptionFr(): ?string
   {
       return $this->descriptionFr;
   }

   public function setDescriptionFr(string $descriptionFr): self
   {
       $this->descriptionFr = $descriptionFr;

       return $this;
   }

   public function getDescriptionEn(): ?string
   {
       return $this->descriptionEn;
   }

   public function setDescriptionEn(?string $descriptionEn): self
   {
       $this->descriptionEn = $descriptionEn;

       return $this;
   }

   /**
    * @return Collection|Themes[]
    */
   public function getTheme(): Collection
   {
       return $this->theme;
   }

   public function addTheme(Themes $theme): self
   {
       if (!$this->theme->contains($theme)) {
           $this->theme[] = $theme;
       }

       return $this;
   }

   public function removeTheme(Themes $theme): self
   {
       $this->theme->removeElement($theme);

       return $this;
   }


}

 
 <?php

namespace AppForm;

use AppEntityEntities;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;

class EntitiesType extends AbstractType
{
   public function buildForm(FormBuilderInterface $builder, array $options)
   {
       $builder
           ->add('entityName')
           ->add('descriptionFr' )
           ->add('descriptionEn')
           ->add('event')
           ->add('theme')
       ;
   }

   public function configureOptions(OptionsResolver $resolver)
   {
       $resolver->setDefaults([
           'data_class' => Entities::class,
       ]);
   }
}
 
 {{ form_start(form) }}
    {{ form_rest(form) }}
    <button class="btn">{{ button|default('Créer')}}</button>
{{ form_end(form) }}


 

Комментарии:

1. Сегодня я столкнулся с той же проблемой, похоже, проблема была в кэше. У php bin/console cache:clear меня сработало просто!

2. Спасибо, я не могу попробовать ваше решение, я просто удалил свою сущность и заменил ее другой.