Как сравнить значение формы до и после отправки в Symfony? - PullRequest
0 голосов
/ 25 июня 2018

Я использую версию symfony 3.4.8.Когда я обновляю данные формы, я хочу увидеть различия до отправки и после отправки.

После $ formEdit-> handleRequest ($ request);строка старого значения меняется на новое значение, но я не хочу его.

но я не смог этого сделать.

Вот мой контроллер.

/**
 * @Route("/contract/{contractId}/Edit", name="contract_edit")
 */
public function editContract(Request $request, $contractId)
{
    $log[]='';

    $contractInfo = $this->getDoctrine()->getRepository('AppBundle:myContract\Contract')->find($contractId);

    $formEdit = $this->createForm(ContractEditType::class, $contractInfo);

    $log[0]= $contractInfo;
    dump($log[0]); // Old value is coming here

    $formEdit->handleRequest($request);

    if ($formEdit->isSubmitted() && $formEdit->isValid()) {

        $log[1]= $contractInfo; //new value is comming

        dump($log[0]);

        dump($log[1]);

        // I want to compare the contractInfo before submitting and after submitting.
        // I want to see the differences before and after to take a log.
        // when I submit log[0] and log[1] are coming with same value.


        //Updating Contract table..
        $this->getDoctrine()->getManager()->flush();
        dump($this->getDoctrine()->getManager()->flush());

        $this->addFlash(
            'notice', 'Data is Updated.'
        );

        return $this->redirectToRoute('staff_index');
    }

    return $this->render('contract/contract_edit.html.twig',
        array(
            'contractInfo' => $contractInfo,
            'form' => $formEdit->createView(),
        )
    );
}

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Вы должны просто проверить объект (путем его клонирования) перед обновлением объекта из формы

public function functionToCompare($original, $new)
{
    return true;
}

/**
 * @Route("/contract/{contractId}/Edit", name="contract_edit")
 */
public function editContract(Request $request, $contractId)
{

    $contractInfo = $this->getDoctrine()->getRepository('AppBundle:myContract\Contract')->find($contractId);

    $formEdit = $this->createForm(ContractEditType::class, $contractInfo);

    $formEdit->handleRequest($request);

    if ($formEdit->isSubmitted() && $formEdit->isValid()) {

        $oldContractInfo = clone $contractInfo; // save old entity

        $contractInfo = $form->getData(); // update entity from form

        $this->functionToCompare($oldContractInfo, $contractInfo);

        //Updating Contract table..
        $this->getDoctrine()->getManager()->flush();

        $this->addFlash(
            'notice', 'Data is Updated.'
        );

        return $this->redirectToRoute('staff_index');
    }

    return $this->render('contract/contract_edit.html.twig',
        array(
            'contractInfo' => $contractInfo,
            'form' => $formEdit->createView(),
        )
    );
}
0 голосов
/ 25 июня 2018

В php объекты передаются по ссылке.Посмотрите на этот небольшой пример.

<?php

class A {
    public $b = 1;
}

$a = new A();
$b = $a;
$bStill = clone($a);
// when we change $a it will affect $b, but not $bStill, because theres cloned object from previous state of object $a
$a->b = 2;
$c = $a;

// ["b"] => 2
var_dump($b);
// ["b"] => 2
var_dump($c);
// ["b"] => 1
var_dump($bStill);

Так что для вашего случая попробуйте использовать $log[0] = clone($contractInfo);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...