Jak u Kdyby\Doctrine dostat do entity id uživatele pomocí Kdyby\Events (nebo jinak?)

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Jan Mikeš
Člen | 771
+
+1
-

Chtěl bych do své BaseEntity (od které dědím úplně všechny entity) automaticky plnit property $createdByUserId:

/**
* @ORM\Column(type=“integer”, nullable=true)
*/
protected $createdByUserId;

Tuto property bych chtěl samozřejmě automaticky plnit pomocí Nette\Security\User->getId() Zkoušel jsem Kdyby\Events, ale ztroskotal jsem na tom, že entita není service, takže se listener nevolal – lze to nějak obejít, případně jak?

Díval jsem se na http://docs.doctrine-project.org/…/events.html#… zde mi není ale 100% jasné jak postupovat.

Prosím o nakopnutí, co bude nejlepším řešením pro tuto situaci.

Editoval Lexi (18. 11. 2014 19:16)

Filip Procházka
Moderator | 4668
+
+3
-

Nesmíš mít entitu jako listener, ale listener musí být další třída která plní tuto property v entitě z venku.

akadlec
Člen | 1326
+
0
-

a nebo implementovat gedmo či jiné rozšíření doctrine co tyto listenery přidává

Jan Mikeš
Člen | 771
+
0
-

O toto jsem se snažil, jenže nevím co dělám špatně.

Vytvořil jsem si listener a zaregistroval ho s tagem v configu:

-
		class: App\Events\EntityInsertListener
		tags: [kdyby.subscriber]
namespace App\Events;

use Nette,
	Kdyby;

final class EntityInsertListener extends Nette\Object implements Kdyby\Events\Subscriber
{
	/** @var Kdyby\Doctrine\Entity\Manager */
	private $em;

	/** @var Nette\Security\User */
	private $user;


	public function __construct(Kdyby\Doctrine\EntityManager $em, Nette\Security\User $user)
	{
		$this->em = $em;
		$this->user = $user;
	}


	public function getSubscribedEvents()
	{
		return array(
			'App\BaseEntity::onPrePersist',
		);
	}


	public function onPrePersist(\App\BaseEntity $entity)
	{
		$entity->setCreatedByUserId($this->user->getId());
		$this->em->persist($entity);
		$stop(); // Debugbreak -> nevolá se
	}
}

A zkráceně baseentita, na kterou chci event navěsit:

<?php

namespace App;

use Doctrine\ORM\Mapping as ORM,
	Doctrine\ORM\Event\LifecycleEventArgs;

/**
 *  @author Jan Mikes <j.mikes@me.com>
 *  @copyright Jan Mikes - janmikes.cz
 */
abstract class BaseEntity extends \Kdyby\Doctrine\Entities\BaseEntity
{
	public $onPrePersist = [];


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


	/**
	 * @ORM\PrePersist
	 */
	public function prePersist()
	{
		$this->onPrePersist($this);
		// $stop(); // debugbreak -> pokud odkomentuji zde, debugbreak se provede!
	}


	final public function setCreatedByUserId($id)
	{
		$this->createdByUserId = $id;
	}
}

Je možné, že jsem Kdyby\Events špatně pochopil a bude to nějaká prkotina..

jiri.pudil
Nette Blogger | 1029
+
0
-

Vůbec to nedávej do BaseEntity:

class FooListener implements Kdyby\Events\Subscriber
{
	private $user;

	public function __construct(Nette\Security\User $user)
	{
		$this->user = $user;
	}

	public function getSubscribedEvents()
	{
		return [Doctrine\ORM\Events::prePersist];
	}

	public function prePersist(Doctrine\ORM\Event\LifecycleEventArgs $args)
	{
		$args->getEntity()->setCreatedByUserId($this->user->getId());
	}
}

Editoval jiri.pudil (19. 11. 2014 11:36)

Jan Mikeš
Člen | 771
+
0
-

Díky moc, toto vyřešilo můj problém přesně tak jak jsem potřeboval!