Jak u Kdyby\Doctrine dostat do entity id uživatele pomocí Kdyby\Events (nebo jinak?)
- Jan Mikeš
- Člen | 771
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
Nesmíš mít entitu jako listener, ale listener musí být další třída která plní tuto property v entitě z venku.
- Jan Mikeš
- Člen | 771
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
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)