Ожидается аргумент типа "целое число", "App \ Entity \ Material" - PullRequest
0 голосов
/ 06 июля 2018

Прежде всего я должен сказать, что я новичок в Symfony, поэтому извините, если задаю какой-то глупый вопрос.

У меня есть контроллер, который создает форму с некоторыми полями EntityType, которые отображают раскрывающиеся списки в шаблоне, и у меня также есть базовый код для обработки отправки формы.

Моя проблема заключается в том, что когда форма отправляется, она выглядит в некоторой части кода (например, $ form-> handleRequest ($ request) или $ entity = $ form-> getData () ) происходит сбой при обработке объекта $ form с опубликованными значениями запроса, и в сообщении об ошибке указывается, что это происходит потому, что в первом обработанном поле EntityType он ожидает целочисленный тип вместо класса объекта Entity.

Я не вижу, в чем проблема в моем коде, все, что я могу сказать, - я ожидаю, что выпадающие списки со значениями целочисленного типа будут опубликованы как целые числа, а не как объекты Entity: /

Также извините за мой плохой английский, надеюсь, вы все поняли прилично. Спасибо за чтение.

namespace App\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use App\Entity\Lot;
use App\Entity\Material;
use App\Entity\Provider;
use App\Entity\Responsable;

class CompraController extends Controller
{
/*
 * @Route("/buy_lot", name="buy")
 * @Method({"GET","POST"})
 */
public function index(Request $request)
{
    $lot = new Lot();
    $form = $this->createFormBuilder($lot, array('allow_extra_fields' => true))
        ->add('IDmaterial', EntityType::class, array(
            'class' => Material::class,
            'required' => true,
            'choice_value' => function ($material) {
                return $material ? $material->getIDmaterial() : '';
            },
            'choice_label' => function ($material1) {
                return $material ? $material->getNameMaterial() : '';
            }
        ))
        ->add('N_Lot', TextType::class, array(
            'required' => true,
        ))
        ->add('Quantity', IntegerType::class, array('required' => true))
        ->add('Price', NumberType::class, array(
            'required' => true,
            'scale' => 2,
        ))
        ->add('IDprovider', EntityType::class, array(
            'class' => Provider::class,
            'required' => true,
            'choice_value' => function ($provider) {
                return $provider ? $provider->getIDprovider() : '';
            },
            'choice_label' => function ($provider) {
                return $provider ? $provider->getNameProvider() : '';
            }
        ))
        ->add('IDresponsable', EntityType::class, array(
            'class' => Responsable::class,
            'required' => true,
            'choice_value' => function ($responsable) {
                return $responsable ? $responsable->getIDresponsable() : '';
            },
            'choice_label' => function ($responsable) {
                return $responsable ? $responsable->getNameResponsable() : '';
            }
        ))
        ->add('save', SubmitType::class, array('label' => 'Buy'))
        ->getForm();

    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {
            $lot = $form->getData();
            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($lot);
            $entityManager->flush();
        return $this->redirectToRoute('buy');
    }

    return $this->render('stock_app/buy.html.twig', [ 
       'form' => $form->createView(),
    ]);
}

И моя сущность Лота (которая должна быть очищена) выглядит следующим образом:

/**
 * @ORM\Id()
 * @ORM\GeneratedValue()
 * @ORM\Column(type="integer")
 */
private $IDlot;

/**
 * @ORM\Column(type="integer", nullable=true)
 */
private $N_Lot;

/**
 * @ORM\Column(type="integer", nullable=true)
 */
private $Quantity;

/**
 * @ORM\Column(type="float", scale=2, nullable=true)
 */
private $Price;

/**
 * @ORM\OneToMany(targetEntity="Provider", mappedBy="IDprovider", cascade={"persist"})
 * @ORM\Column(type="integer")
 */
private $IDprovider;

/**
 * @ORM\OneToMany(targetEntity="Responsable", mappedBy="IDresponsable", cascade={"persist"})
 * @ORM\Column(type="integer")
 */
private $IDresponsable;

/**
 * @ORM\OneToMany(targetEntity="Material", mappedBy="IDmaterial", cascade={"persist"})
 * @ORM\Column(type="integer")
 */
private $IDmaterial;

1 Ответ

0 голосов
/ 06 июля 2018

Измените аннотацию вашей доктрины с:

/**
 * @ORM\OneToMany(targetEntity="Material", mappedBy="IDmaterial", cascade={"persist"})
 * @ORM\Column(type="integer")
 */
private $IDmaterial;

до:

/**
 * @ORM\OneToMany(targetEntity="Material", mappedBy="IDmaterial", cascade={"persist"})     
 */
private $material;

Вам не нужно указывать типы столбцов в свойствах отношений, поэтому не указывайте их во всех определениях отношений

...