1

Artist エンティティと単純な User エンティティがあります。

私のウェブサイトでは 2 つの登録が可能です。1 つはアーティスト用、もう 1 つは一般ユーザー用です。ユーザーはすべて正常に動作し、確認メールなどを受け取ります。うまく機能しますが、今回は、アーティストが私の Web サイトに登録するときに (アーティストが Web サイトのユーザーとしても登録されるように、FosUserBundle の UserType を埋め込みます)。 )、入力された電子メールの有効性を確認してからユーザーを有効にするための電子メール確認は、単純なユーザーのように送信されません。

アーティスト登録のために呼び出されるアクションは、FosUserBundle の RegistrationController の registerAction ではなく、ArtistController のアクション newAction であるため、これが発生していないことはわかっています。

そこで、RegistrationController と RegistrationFormHandler のいくつかのコードを使用しようとしましたが、ArtistHandler 内のメーラー インターフェイスやトークン ジェネレーターなどを使用することができないため、機能させることができません。

ここに私のArtistHander.phpがあります

<?php

namespace My\Bundle\BrocBundle\Form;

use Symfony\Component\Form\Form;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\EntityManager;

use My\Bundle\BrocBundle\Entity\Artist;

use FOS\UserBundle\Mailer\Mailer;
use FOS\UserBundle\Util\TokenGenerator;

class ArtistHandler
{
    protected $form;
    protected $request;
    protected $em;

    public function __construct(Form $form, Request $request, EntityManager $em, Mailer $mailer, TokenGenerator $tokenGenerator)
    {
        $this->form = $form;
        $this->request = $request;
        $this->em = $em;
        $this->mailer = $mailer;
        $this->tokenGenerator = $tokenGenerator;
    }

    public function process()
    {
        if ($this->request->getMethod() == 'POST') 
        {
            $this->form->bindRequest($this->request);

            if ($this->form->isValid() ) 
            {
                $this->onSuccess($this->form->getData());
                return true;
            }
        }

        return false;
    }

    public function onSuccess(Artist $artist)
    {

        $user = $artist->getUser();
        $user->setEnabled(false);

        if (null === $user->getConfirmationToken()) 
        {
            $user->setConfirmationToken($this->tokenGenerator->generateToken());
        }

        $this->mailer->sendConfirmationEmailMessage($user);


        $this->userManager->updateUser($user);

        $this->em->persist($artist);
        $this->em->flush();
    }

}
4

3 に答える 3

2

メーラーを使用したい場合は、あなたがやっているように、それを注入する必要がありますEntityManager

そう:

  • あなたの(またはcorrisspective)にあなたのクラスservice.ymlに対する注入を追加してくださいArtistHandler
  • コンストラクArtistHandlerターの変更

詳細については、このページにアクセスすることもできます(symfony2 のドキュメント; 別のアプローチ)

于 2013-02-06T09:31:38.333 に答える
0

私も同じ問題を抱えていました。私は別のアプローチを使用しました。じっくり見てonSuccessください

<?php

namespace  UsersBundle\Form\Handler;

use FOS\UserBundle\Form\Handler\RegistrationFormHandler as BaseHandler;
use FOS\UserBundle\Model\UserInterface;
use UsersBundle\Entity\User;
use AdminBundle\EntityDao\EntidadDao;
use AdminBundle\EntityDao\RolDao;
use UsersBundle\EntityDao\UserDao;

class RegistrationFormHandler extends BaseHandler{
    private $auditUser;
    private $entId;
    private $userInterno;

    private $container;

    public function __construct($form, $request, $userManager, $mailer, $container){
        parent::__construct($form, $request, $userManager, $mailer);
        $this->container = $container;
    }

    public function processIns($entId, $userInterno, $auditUserIns, $confirmation = false){
        $this->auditUser = $auditUserIns;
        $this->entId = $entId;
        $this->userInterno = $userInterno;

        return $this->process($confirmation);
    }

    /*public function processUpd($confirmation = false, $auditUserUpd){
        $this->auditUserUpd = $auditUserUpd;
        return $this->process($confirmation);
    }*/

    public function process($confirmation = false){
        $user = $this->userManager->createUser();
        $this->form->setData($user);

        if ('POST' == $this->request->getMethod()) {
            $this->form->bindRequest($this->request);

            if ($this->form->isValid()) {

                $tmp = $user->getIdUsuario();


                //Si es update
                if(empty($tmp) ){
                    $user->setAuditUserIns($this->auditUser);
                    $user->setAuditDateIns(new \DateTime());

                    $tmp = $this->entId;
                    if( !empty($tmp)){
                        $entidadDao = new EntidadDao($this->container->get("doctrine"));
                        $entidad = $entidadDao->getEntidad($this->entId);
                        $user->setEntidad($entidad);
                    }

                //Si es Insert    
                }else{
                    $userDao = new UserDao($this->container->get("doctrine"));

                    //Se obtiene el registro de la BD
                    $tmp = $userDao->getUserEspecifico($user->getIdUsuario());

                    //Se le asigna al Formulario
                    $this->form->setData($tmp);

                    //Se realiza un merge con lo que se envio en el Request
                    $this->form->bindRequest($this->request);

                    $user = $tmp;
                    $tmp->setAuditUserUpd($this->auditUser);
                    $tmp->setAuditDateUpd(new \DateTime());
                }

                $rolDao= new RolDao($this->container->get("doctrine"));

                //Se asignan roles dependiendo del usuario interno
                if($this->userInterno =='false'){
                    $user->setRols($rolDao->getRolesEspecificos(
                            $user->getEntidad()->getEntImportador(),
                            $user->getEntidad()->getEntProductor(),
                            $user->getEntidad()->getEntComprador(),
                            $user->getEntidad()->getEntCompVend(),
                            $user->getUserTipo(),
                            $user->getUserInterno(),
                            $user->getUserInternoTipo()
                    ));
                }else{
                    $user->setRols($rolDao->getRolesEspecificos(
                            false,
                            false,
                            false,
                            false,
                            $user->getUserTipo(),
                            $user->getUserInterno(),
                            $user->getUserInternoTipo()
                    ));
                }


                //Hacer busqueda de los roles segun los campos de tipos y obtener el listado de objetos.
                $this->onSuccess($user, $confirmation);
                // do your custom logic here
                return true;
            }
        }

        return false;
    }

    protected function onSuccess(UserInterface $user, $confirmation){
        // Note: if you plan on modifying the user then do it before calling the 
        // parent method as the parent method will flush the changes

        //parent::onSuccess($user, $confirmation);

        if ($confirmation) {
            $user->setEnabled(false);
            $user->generateConfirmationToken();
            $this->mailer->sendConfirmationEmailMessage($user);
        } else {
            $user->setConfirmationToken(null);
            $user->setEnabled(true);
        }

        $this->userManager->updateUser($user);

        // otherwise add your functionality here
    }
}
于 2013-02-25T21:33:32.570 に答える