Symfony2: подписка на рассылку новостей

Мне нужно, чтобы подписка на информационный бюллетень работала. Логика, которую я использую, заключается в том, что когда пользователь отправляет свою электронную почту, я проверяю, зарегистрирован ли уже пользователь на сайте с электронной почтой. Если да, я проверяю, подписан ли он на рассылку новостей, и делаю соответствующую подписку. Если адрес электронной почты отсутствует в списке зарегистрированных пользователей, у меня есть таблица рассылки для анонимных пользователей. Я проверяю здесь, подписан он или нет, и делаю необходимые действия.

Вот мой код действия контроллера:

/**
 * @Route("/newsletter/", name="site_newsletter")
 * @return array
 */
public function newsletterSubscriptionAction(httpRequest $request)
{  
    $email = $request->request->get('email');

    try {

        $email = $request->request->get('email');
        $em = $this->getDoctrine()->getEntityManager();
        $query = $em->createQuery(
            'SELECT u FROM MyBundle:User u WHERE u.email = :email'
        )->setParameter('email', $email);

        $user = $query->getSingleResult();

        if(!is_object($user)){ //this means anonymous user not registered to site
            $em = $this->getDoctrine()->getEntityManager();
            $query = $em->createQuery(
                'SELECT n FROM MyBundle:Newsletter n WHERE n.email = :email AND n.isSubscribed = 1'
            )->setParameter('email', $email);

            $record = $query->getSingleResult();

            if($record){
                $msg = "You are already subscribed!";
            }else{
                $newsletter = new Newsletter();
                $newsletter->setEmail($email);
                $newsletter->setIsSubscribed(true);

                $em = $this->getDoctrine()->getEntityManager();
                $em->persist($newsletter);
                $em->flush();

                $msg = "You have been subscribed to our newsletter! Thank You.";
            }
        }else{
            if($user->getNewsletterSubscription()){
                $msg = "You are already subscribed!";
            }else{
                $user->setNewsletterSubscription(1);
                $em = $this->getDoctrine()->getEntityManager();
                $em->flush();                    
                $msg = "You have been subscribed to our newsletter! Thank You.";
            }                
        }

    }
    catch (\Exception $e) {
        $msg = 'Some problem occured. Please try again later';
    }

    if ($this->getRequest()->isXmlHttpRequest()) {
        return new \Symfony\Component\HttpFoundation\Response($msg);
        return array('msg' => $msg);
    }

}

Я использую ajax для вызова этого действия контроллера. Это не работает. Данные, возвращающиеся на страницу входа в систему ajax, перенаправляются.

Кстати, для управления пользователями я использую FOSUserBundle. Это вызывает какие-либо проблемы? Каков наилучший способ реализовать это?

Заранее спасибо!


person VishwaKumar    schedule 10.04.2012    source источник


Ответы (1)


Похоже, вам нужно дать анонимным пользователям разрешение на использование вашего маршрута подписки.

В файле security.yml добавьте что-то вроде:

security:
    access_control:
        - { path: ^/subscribe, roles: IS_AUTHENTICATED_ANONYMOUSLY }
person Cerad    schedule 10.04.2012
comment
Привет. Подтолкнул меня более чем на 2000 повторений. Спасибо. - person Cerad; 11.04.2012