![](/img/trans.png)
[英]Symfony2 Doctrine 'preUpdate' event to encode password
[英]Symfony2 Event Listener preUpdate
我在service.yml 中配置了一些事件監聽器
registerproduct.listener:
class: App\AppBundle\Listener\RegisterProductListener
arguments: [ @service_container ]
tags:
- { name: doctrine.event_listener, event: prePersist }
- { name: doctrine.event_listener, event: preUpdate }
當我執行 prePersist 而不是 preUpdate 時,我的方法decrementProductQuantity()非常有效。
在更新過程中,產品數量減少得很好,但數據庫中沒有變化。
這是我的事件代碼:
public function prePersist(LifecycleEventArgs $args)
{
$this->decrementProductQuantity($args);
}
public function preUpdate(LifecycleEventArgs $args)
{
$this->decrementProductQuantity($args);
}
public function decrementProductQuantity(LifecycleEventArgs $args)
{
/** @var RegisterProduct $registerProduct */
$registerProduct = $args->getEntity();
if (!($registerProduct instanceof RegisterProduct))
return;
if ($registerProduct->getStatus() == 'inscription') {
$product = $registerProduct->getProduct();
$product->setQuantityStock($product->getQuantityStock() - $registerProduct->getQuantity());
}
}
這是我的控制器中的更新代碼:
/**
* @param Register $register
* @return \Symfony\Component\HttpFoundation\Response
*/
public function confirmAction(Request $request, Register $register)
{
$em = $this->getDoctrine()->getManager();
foreach($register->getRegisterProducts() as $registerProduct){
$registerProduct->setStatus('inscription');
$em->persist($registerProduct);
$em->flush();
}
return $this->redirectWithMode($this->generateUrl('asc_activity_register_show', array('register' => $register->getId())));
}
我不知道為什么當我在數據庫中添加一些東西時它會起作用,但不能用於更新。
謝謝你的幫助。
在您的 preUpdate 偵聽器上,您應該重新計算產品實體的變更集
public function decrementProductQuantity(LifecycleEventArgs $args)
{
/** @var RegisterProduct $registerProduct */
$registerProduct = $args->getEntity();
if (!($registerProduct instanceof RegisterProduct))
return;
if ($registerProduct->getStatus() == 'inscription') {
$product = $registerProduct->getProduct();
$product->setQuantityStock($product->getQuantityStock() - $registerProduct->getQuantity());
$em = $args->getEntityManager();
$uow = $em->getUnitOfWork();
$className = \Doctrine\Common\Util\ClassUtils::getClass($product);
$classMetadata = $em->getClassMetadata($className);
$uow->recomputeSingleEntityChangeSet($classMetadata, $product);
}
}
這是因為在您的控制器(或其他地方)中,您的代碼沒有更新產品實體。 在偵聽器執行學說之前計算每個實體的更改集。 因此,在您的preUpdate偵聽器原則中對產品一無所知(因為它沒有改變)。
嘗試更改 preUpdate 方法的簽名:
use Doctrine\ORM\Event\PreUpdateEventArgs;
/.../
public function preUpdate(PreUpdateEventArgs $args)
{
$this->decrementProductQuantity($args);
}
/.../
因為沒找到awnser所以最后選擇直接在controller里面做:
/**
* @param Register $register
* @return \Symfony\Component\HttpFoundation\Response
*/
public function confirmAction(Request $request, Register $register)
{
$mode = $this->getMode($request);
$em = $this->getDoctrine()->getManager();
foreach ($register->getRegisterProducts() as $registerProduct) {
if($registerProduct->getStatus() != 'inscription'){
$product = $registerProduct->getProduct();
$product->setQuantityStock($product->getQuantityStock() - $registerProduct->getQuantity());
}
$registerProduct->setStatus('inscription');
}
$em->flush();
return $this->redirectWithMode($this->generateUrl('asc_activity_register_show', array('register' => $register->getId())), $mode);
}
如果有人找到答案,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.