Не удается связать данные формы с функцией поиска доктрины. "ORMInvalidArgumentException" - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь сделать простую гостевую книгу в Symfony 4 , моя цель в том, чтобы вы могли добавить сообщение в гостевую книгу, но перед этим оно должно быть внутренне активирован. Сейчас я работаю над активирующим сайтом, но есть проблема, которую я не могу исправить.Сообщение об ошибке выглядит следующим образом:

Привязка сущностей к параметрам запроса разрешена только для сущностей, имеющих идентификатор.

То, что я пытаюсь сделать, это после вы ввели идентификатор неактивированного сообщения в форме активатора , он принимает данные (ID) из форма , которая была дана, и Доктрина находит конкретную строку этого идентификатора .Затем он изменяет строки smallint (не логическое) "isActive" на 1 , поэтому гостевая книга знает , какие сообщения показывать.

На " $ message = $ repository-> find ($ id); " symfony не удалось связать данные моей формы с параметрами запроса.Я уже попробовал этот ответ, но он тоже не сработал.

GBActivatorController.php:

  use App\Entity\Guestbook;

  use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  use Symfony\Component\Routing\Annotation\Route;
  use Symfony\Component\HttpFoundation\Response;
  use Symfony\Component\HttpFoundation\Request;
  use Symfony\Component\Form\Extension\Core\Type\TextType;
  use Symfony\Component\Form\Extension\Core\Type\NumberType;
  use Symfony\Component\Form\Extension\Core\Type\SubmitType;


  class GBActivatorController extends AbstractController
    {
        public function index(Request $request)
          {

            //sets up the entity guestbook and the entitymanager from doctrine
            $guestbook = new Guestbook();
            $entityManager = $this->getDoctrine()->getManager();

            //get all messages
            $list = $this->getDoctrine()
              ->getRepository(Guestbook::class)
              ->findAll();

              //create form for activating a non-activated message
            $activator = $this->createFormBuilder($guestbook)
              ->add('id', NumberType::class,
                array(
                  'mapped' => false,
              ))
              ->add('activate', SubmitType::class, ['label' => 'Activate'])
              ->getForm();

            $activator->handleRequest($request);

              /*when the submit button is clicked, get the data and
               find the row with the specific id that was given.*/
              if($activator->isSubmitted())
              {
                //gets the data from the form
                $id = $activator->getData();

                //sets up repository, so i dont need to type it again
                $repository = $this->getDoctrine()->getRepository(Guestbook::class);

                //(should) find the row
                $message = $repository->find($id);
                //activates row. (isActive = 1 instead of isActive = 0)
                $message->setIsActive(1);

                //persist and then execute to table
                $entityManager->persist($message);
                $entityManager->flush();
              }

            //renders the template
            return $this->render('GBActivator.html.twig', array(
              'list' => $list,
              'activator' => $activator->createView()
              ));

          }
    }

Entity / Guestbook.php:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\GuestbookRepository")
 */
class Guestbook
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    public $id;

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

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

    /**
     * @ORM\Column(type="smallint")
     */
    private $isActive;

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

    public function getEmail(): ?string
    {
        return $this->email;
    }

    public function setEmail(string $email): self
    {
        $this->email = $email;

        return $this;
    }

    public function getText(): ?string
    {
        return $this->text;
    }

    public function setText(string $text): self
    {
        $this->text = $text;

        return $this;
    }

    public function getIsActive(): ?int
    {
        return $this->isActive;
    }

    public function setIsActive(int $isActive): self
    {
        $this->isActive = $isActive;

        return $this;
    }
}

1 Ответ

0 голосов
/ 24 января 2019

Спасибо, Eakethet. Моя проблема заключалась в том, что я потребовал массив вместо строки. Глупый я. Я изменил

public function setId(Array $id)
{
    $this->id = $id;
}

до

public function setId(string $id)
    {
        $this->id = $id;
    }
...