如何在没有注册的情况下在FOSUserBundle中使用邮件程序?

时间:2017-01-03 10:32:35

标签: php symfony doctrine-orm fosuserbundle

我为实体事件创建了一个表单,其中包含“email”和“password”等用户字段,用于在控制器中手动创建用户。

我可以毫无问题地创建活动和用户,但我需要发送确认邮件以启用该用户。我可以从正常的注册表单中做到,但在这里我不知道该怎么做。

对不起,如果我的英语不是很好。我正在学习它。

控制器:

class EventController extends Controller
{

    public function ajaxAction(Request $request) {
        if (! $request->isXmlHttpRequest()) {
            throw new NotFoundHttpException();
        }
        // Get the province ID
        $id = $request->query->get('category_id');
        $result = array();
        // Return a list of cities, based on the selected province
        $repo = $this->getDoctrine()->getManager()->getRepository('CASEventBundle:Subcategory');
        $subcategories = $repo->findByCategory($id, array('category' => 'asc'));
        foreach ($subcategories as $subcategory) {
            $result[$subcategory->getName()] = $subcategory->getId();
        }
        return new JsonResponse($result);
    }

    public function indexAction(Request $request) {     
        $lead = new Lead();
        $em = $this->getDoctrine()->getManager(); 
        $user = $this->getUser();

        if(is_object($user)) {
            $promotor = $em->getRepository('CASUsuariosBundle:Promotor')->find($user);

            if (is_object($promotor)) {
                $form = $this->createForm(new EventType($this->getDoctrine()->getManager()), $lead);
                $template = "CASEventBundle:Default:event.html.twig";
                $isPromotor = true;
            }
        } else {
            $form = $this->createForm(new LeadType($this->getDoctrine()->getManager()), $lead);
            $template = "CASEventBundle:Default:full_lead.html.twig";
            $isPromotor = false;
        }

        if ($request->getMethod() == 'POST') {
            $form->bind($request);
            if ($form->isValid()) {
                if($isPromotor === true) {
                    $type = $promotor->getType();
                    $name = $user->getName();
                    $lastname = $user->getLastName();
                    $email = $user->getEmail();
                    $password = $user->getPassword();
                    $phone = $user->getPhone();
                    $company = $promotor->getCompany();
                    $lead->setEventType($type);
                    $lead->setPromotorName($name);
                    $lead->setPromotorLastName($lastname);
                    $lead->setPromotorEmail($email);
                    $lead->setPromotorPhone($phone);
                    $lead->setPromotorCompany($company);
                }
                $emailReg = $form->get('promotorEmail')->getData();
                $passwordReg = $form->get('promotorPassword')->getData();
                $nameReg = $form->get('promotorName')->getData();
                $typeReg = $form->get('promotorType')->getData();
                $lastnameReg = $form->get('promotorLastName')->getData();
                $phoneReg = $form->get('promotorPhone')->getData();
                $companyReg = $form->get('promotorCompany')->getData();

                if(!empty($emailReg) && !empty($passwordReg)) {
                    $userManager = $this->get('fos_user.user_manager');
                    $newUser = $userManager->createUser();
                    $newPromotor = new Promotor();

                    $newUser->setUsername($emailReg);
                    $newUser->setEmail($emailReg);
                    $newUser->setName($nameReg);
                    $newUser->setLastname($lastnameReg);
                    $newUser->setPhone($phoneReg);
                    $newUser->setIsPromotor(true);

                    $encoder = $this->container->get('security.password_encoder');
                    $encoded = $encoder->encodePassword($newUser, strval($passwordReg));
                    $newUser->setPassword($encoded);
                    $userManager->updateUser($newUser);
                    $newPromotor->setType($typeReg);
                    $newPromotor->setCompany($companyReg);
                    $newPromotor->setIdPromotor($newUser);
                    $em->persist($newUser);
                    $em->persist($newPromotor);
                    $em->persist($lead);
                    $em->flush();

                    //return $response;
                }
                $em->persist($lead);
                $em->flush();
                return $this->redirect($this->generateUrl('CASEventBundle_create'));
            }
        }
        return $this->render($template, array('form' => $form->createView()));
    }
}

1 个答案:

答案 0 :(得分:0)

你可以自己创建一个确认令牌并将其设置为尚未活跃的用户,使用swift发送给他的邮件包含一个链接以确认如下:

$confiToken = "123";
$url="http://url.com/confirm/$confiToken";
$user->setConfirmationToken($confiToken);

$message = $mailer->createMessage()
    ->setSubject('Confirm registration')
    ->setFrom('from@mail.com')
    ->setTo($sendTo)
    ->setBody(
        $this->renderView(
        'Bundle:Email:confirm.html.twig',
        array(
            'headline' => "Confirm your registration",
            "sendTo"=>$sendTo,
            "name"=>false,
            "date"=>$date,
            "message"=>"here ist your confirmationlink ".$url." "
            )
    ),
    'text/html'
);
$mailer->send($message);

当用户点击电子邮件中的链接时,您可以手动生成令牌并将用户设置为活动状态:

use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;

...

    $user=$em->getRepository("Bundle:User")->findOneByConfirmationToken($token);
    if(!$user || $user->isEnabled()){
        throw $this->createNotFoundException("link out of date");
    }else {
        $user->setEnabled(true);
        $token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
        $this->get('security.context')->setToken($token);
        $this->get('session')->set('_security_main',serialize($token));

        $em->flush();
        return $this->redirect($this->generateUrl('core_customer_dashboard'));

    }