Единица работы Исключение Symfony - PullRequest
0 голосов
/ 07 мая 2018

Это очень странно, когда я пробую свой код на разработчике и работает нормально, но при работе выдает ошибку 500, пока я пытаюсь получить результаты.

var / logs / prod.log :

request.CRITICAL: Uncaught PHP Exception Symfony\Component\Debug\Exception\FatalThrowableError: "Call to a member function setValue() on null" at /my_route/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 2745 {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalThrowableError(code: 0): Call to a member function setValue() on null at /my_route/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:2745)"} []

Лица, замешанные в: Договор

class Contract
{
/**
 * @var integer
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue()
 * @ORM\Id()
 */
private $id;
/**
 * @ORM\Column(type="integer", nullable=false)
 */
private $duration;
/**
 * @ORM\Column(type="string", nullable=true)
 */
private $nifHolder;

/**
 * @var Hotel
 * @ORM\OneToOne(targetEntity="AppBundle\Entity\Hotel", inversedBy="contractHotel")
 */
private $hotel;

А Отель

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

/**
 * @var string
 * @Assert\Length(
 *      max = 100,
 *      maxMessage = "El nombre no puede tener más de 100 caracteres"
 * )
 * @Assert\NotBlank(message="El nombre es obligatorio")
 * @ORM\Column(type="string", length=100, nullable=false)
 */
private $name;

/**
 * @var string
 * @Assert\Length(
 *      max = 200,
 *      maxMessage = "La dirección no puede tener más de 200 caracteres"
 * )
 * @Assert\NotBlank(message="La dirección es obligatoria")
 * @ORM\Column(type="string", length=200, nullable=false)
 */
private $address;
  /**
   * @var Contract
   * @ORM\OneToOne(targetEntity="AppBundle\Entity\Contract", mappedBy="hotel")
  */
private $contractHotel;

Маршрут которого у меня 500, код ошибки:

/**
     * @Route("/contract_list/{hotel}", name="view_contract")
     * @Security("has_role('ROLE_ADMIN')")
     */
    public function listContractAction(Request $request, Hotel $hotel )
    {
        /** @var EntityManager $em */
        $em = $this->getDoctrine()->getManager();

        $contract = $em->createQueryBuilder()
            ->select('c')
            ->from('AppBundle:Contract', 'c')
            ->where('c.hotel =:hotel')
            ->setParameter('hotel', $hotel->getId())
            ->getQuery()
            ->getResult();

        if($contract == []) {
            $contract = new Contract();

            $em->persist($contract);
            $contract->setDuration(0);
            $contract->setHaveOpticalFiber(false);
            $contract->setHaveRadioFibraPTP(false);
            $contract->setOpticalFiberOperator('Not defined');
            $contract->setHotel($hotel);
            $em->flush();
        }

        return $this->render('contract/viewContract.html.twig', [
            'contract' => array_key_exists(0, $contract) ? $contract[0] : $contract,
            'hotel' => $hotel

        ]);

В базе данных все в порядке, mapped проверяется, даже когда я делаю $ em-> flush (); строка вставки

РЕДАКТИРОВАТЬ: Возможно ли, что моя ошибка вызвана тем, что я использую "composer install --optimize-autoload" перед добавлением сущностей?

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Хорошо, я дурак, решение простое: перезапусти apache и ... все работает!

0 голосов
/ 07 мая 2018

попробуйте изменить это:

        $em->persist($contract);
        $contract->setDuration(0);
        $contract->setHaveOpticalFiber(false);
        $contract->setHaveRadioFibraPTP(false);
        $contract->setOpticalFiberOperator('Not defined');
        $contract->setHotel($hotel);
        $em->flush();

на это:

        $hotelEntity = $em->getRepository(AppBundle\Entity\Hotel::class)->find($hotel);

        $contract->setDuration(0);
        $contract->setHaveOpticalFiber(false);
        $contract->setHaveRadioFibraPTP(false);
        $contract->setOpticalFiberOperator('Not defined');
        $contract->setHotel($hotelEntity);
        $em->persist($contract);
        $em->flush();

Когда вы делаете setHotel, вам нужно передать объект, а не идентификатор

...