我正在使用symfony2.3。 我创建RequestListener并在用户登录时写入然后转到home操作 赚了一些奖励积分。这很有效。 但是我如何才能做到这一点只有当用户第一次回家时才能获得积分。如果用户多次回家动作则不会更新奖励积分?
RequestListner.php
<?php
namespace XXX\ABCBundle\EventListener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\HttpKernel\HttpKernel;
use Doctrine\ORM\EntityManager;
use Thinkdigit\UserBundle\Entity\User;
class RequestListener
{
/**
* @var \Symfony\Component\Security\Core\SecurityContextInterface
*/
protected $securityContext;
protected $em;
/**
* Container
*
* @var ContainerInterface
*/
protected $container;
/**
* Listener constructor
*
* @param ContainerInterface $container
*/
public function __construct(ContainerInterface $container, SecurityContextInterface $securityContext, EntityManager $em)
{
$this->container = $container;
$this->securityContext = $securityContext;
$this->em = $em;
}
/**
* kernel.request Event
*
* @param GetResponseEvent $event
*/
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
$controller = $request->get('_controller');
$home = array('XXX\ABCBundle\Controller\PageHomeController::indexAction', 'XXX\ABCBundle\Controller\RegistrationController::confirmedAction');
//print_r($controller);die;
if ( $this->container->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY'))
{
if(in_array($controller,$home)){
$user = $this->container->get('security.context')->getToken()->getUser();
//print_r($user->getRewardPoints());
$point = '5';
$rewrdPoint = $user->getRewardPoints() + $point;
$user->setRewardPoints($rewrdPoint);
$this->em->persist($user);
$this->em->flush($user);
//die;
}
}
// Here you can intercept all HTTP requests, and through $container get access to user information
}
}
答案 0 :(得分:0)
这不是与symfony相关的;最简单的方法是在会话中存储一些东西,检查它;
就像在打开登录用户的主页时,只需设置会话var,并在句柄请求监听器之前检查会话var;
if($controller == $home && $this->container->get('session')->get('reward_was_payed', 0) != 1){
$user = $this->container->get('security.context')->getToken()->getUser();
//print_r($user->getRewardPoints());
$point = '5';
$rewrdPoint = $user->getRewardPoints() + $point;
$user->setRewardPoints($rewrdPoint);
$this->em->persist($user);
$this->em->flush($user);
$this->container->set('reward_was_payed', 1);
}
;