Doctrine ako vykonat akciu pred ulozenim a porovnat data ci sa nezmenili

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
duskohu
Člen | 778
+
0
-

Caute, snazim sa v doctrine pred ulozenim entity vykonat akciu ktora zmeni dalsie stlpec a persistne.
Dalsia vec chcel by som porovnat entitu s tou co je este v db a neni zmenena. Nevie niekto ako na to?

	public function save(Page $entity)
	{
		$connection = $this->em->getConnection();
		$connection->beginTransaction();

		try {

			$this->em->persist($entity);
			$this->treeSlugHandler($entity);
			$this->em->flush();
			$connection->commit();

			return $entity ? : TRUE;
		} catch (\Exception $e) {
			$connection->rollback();
			throw $e;
		}
	}

	private function treeSlugHandler(Page $entity)
	{
		// Tu by som chcel urobit nejake dalsie operacie a porovnat entitu z entitou v db
		$uow = $this->em->getUnitOfWork(); // skusal som si vytiahnut toto a,e neviem ci idem na to spravne

	}
Jiří Nápravník
Člen | 710
+
0
-

Melo by ti pomoci mrknout na EntityListenery , tam si prichytnes na ty konkretni eventy, co potrebujes a upravis.

Btw proc volas rucne transakce, flush je samotny zabalen v transakci, pokdu jsi to nezmenil.

duskohu
Člen | 778
+
0
-

Ze sa vola flush v tranzakci som nevedel, dik. Ten listener treba nejako zaregistrovat? Smozrejme okrem:

/**
 * @Gedmo\Tree(type="nested")
 * @ORM\Table(name="pages")
 * @ORM\Entity
 * @ORM\EntityListeners({"Nas\TreeSlugListener"})
 */
class Page

Editoval duskohu (24. 9. 2014 21:49)

David Matějka
Moderator | 6445
+
0
-

v kdyby/doctrine museji byt entity listenery registrovany jako sluzba

duskohu
Člen | 778
+
0
-

Samozrejme mam, ale stale sa nevola

entita:

/**
 * @Gedmo\Tree(type="nested")
 * @ORM\Table(name="pages")
 * @ORM\Entity
 * @ORM\EntityListeners({"Nas\PagesModule\Model\TreeSlugListener"})
 */
class Page

listener:

namespace Nas\PagesModule\Model;

class TreeSlugListener
{
	public function prePersistHandler($page, $event)
	{
		bd($page);
	}
}

config:

services:
	- Nas\PagesModule\Model\TreeSlugListener
David Matějka
Moderator | 6445
+
0
-

precti si poradne tu docku, pokud maji mit ty metody custom jmena (tedy jine, nez prePersist apod), museji mit anotace.

duskohu
Člen | 778
+
0
-

Aha to som si nevsimol, uz som to skoro skoro chcel riesit, som sa tesil ze to uz pojde, dik, ale aj ked som metodu pomenoval prePersist napriek tomu som nikam nepokrocil, nezavola sa mi.

David Matějka
Moderator | 6445
+
0
-

zkusil si smazat cache? (doctrine metadata cache)

duskohu
Člen | 778
+
0
-

ano skusil

duskohu
Člen | 778
+
0
-

celu cache som zmazal:
_Doctrine.Annotations
_Doctrine.Default.metadata
_Doctrine.Default.query
plus Kdyby a dalsie

Editoval duskohu (25. 9. 2014 0:49)

David Matějka
Moderator | 6445
+
0
-

a vkladas ten zaznam, jo? protoze prePersist se vola pouze pri insertu, nikoliv pri update

duskohu
Člen | 778
+
0
-

takze skusal som variant 1, tento sa mi nespusti

services:
	- Nas\PagesModule\Model\TreeSlugListener
/**
 * @Gedmo\Tree(type="nested")
 * @ORM\Table(name="pages")
 * @ORM\Entity
 * @ORM\EntityListeners({"Nas\PagesModule\Model\TreeSlugListener"})
 */
class Page
<?php
namespace Nas\PagesModule\Model;

class TreeSlugListener
{

	public function onFlush($args)
	{
		bd($args);
	}
}

tento variant s kdyby sa spusti, ale nevyhoda je ze budem musiet osetrovat aby to bolo na konkretnu entitu

services:
	- Nas\PagesModule\Model\TreeSlugListener

	nassluggable:
		class: Nas\PagesModule\Model\TreeSlugListener
		tags: [kdyby.subscriber]
		autowired: no
<?php
namespace Nas\PagesModule\Model;

class TreeSlugListener implements \Kdyby\Events\Subscriber
{

	public function onFlush($args)
	{
		bd($args);
	}

	public function getSubscribedEvents()
	{
		return array(
			'onFlush'
		);
	}
}
David Matějka
Moderator | 6445
+
0
-

entity listener nema onFlush event.