Symfony2 - FOSUserBundle устанавливает поле сущности пользователя после регистрации

У меня есть пользовательский объект с атрибутами firstname, lastname и url, расширяющий пользователя FOSUserBundle. Я хочу сохранить в атрибуте URL значение имени и фамилии как одну строку.

Некоторые люди предложили мне использовать прослушиватель и сервис, поэтому я сделал:

Событие, кажется, работает после регистрации, но я не могу найти способ изменить свой URL-адрес пользователя...

сервисы.yml

services:
   kernel.listener.RegistrationListener:
      class: Apana\Bundle\MainBundle\EventListener\RegistrationListener
      tags:
          - { name: kernel.event_listener, event: fos_user.registration.completed, method: onUserRegistration }

И в RegistrationListener.php:

    <?php

namespace Apana\Bundle\MainBundle\EventListener;

use Apana\Bundle\MainBundle\Entity\User;
use Symfony\Component\Security\Core\SecurityContext;
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\UserEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernel;

class RegistrationListener
{

    public function onUserRegistration()
    {
        $user = new User();

        $ap= = $user->getFirstname();
        echo($ap);exit();

    }

}

person Achilles    schedule 15.07.2014    source источник


Ответы (3)


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

Чтобы все делать автоматически, можно использовать расширение Doctrine, в частности Sluggable: https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/sluggable.md

Это пример использования аннотаций для того, что вам нужно:

<?php
// src/Acme/UserBundle/Entity/User.php

namespace Acme\UserBundle\Entity;

use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(length=64, unique=false)
     */
    private firstname;

    /**
     * @ORM\Column(length=64, unique=false)
     */
    private lastname;

    /**
     * @Gedmo\Slug(fields={"firstname", "lastname"}, separator="-")
     * @ORM\Column(length=128, unique=true)
     */
    private $slug;

    public function __construct()
    {
        parent::__construct();
        // your own logic
    }

    //... setter and getter...
}
person Filo    schedule 16.07.2014
comment
Ваш подход кажется очень интересным, попробую... Спасибо - person Achilles; 18.07.2014

Почему вы не используете для этого UserManager вместо слушателя? Я бы переопределил регистр FOSUser своим собственным и сделал бы что-то вроде:

$userManager = $this->container->get('fos_user.user_manager');
$user = $userManager->createUser();

$user->setUrl("any data");

Это проще и менее сложно, по крайней мере для меня.

person ReynierPM    schedule 16.07.2014
comment
Да, именно это я и имею в виду, так как мне нужно установить некоторые дополнительные поля из пользовательской формы, также это просто предложение. - person ReynierPM; 16.07.2014
comment
Где внутри registerAction (переопределение) это будет происходить, если вы пытаетесь получить пользовательский объект в сообщении? я вижу $user = $form->getData();, но этот объект кажется пустым? и мне нужно, чтобы он был типа User... - person WhiteRuski; 21.05.2015

Хорошо, я решил свою проблему с прослушивателем событий и пользовательским событием FOSUserBundle.

 <?php

namespace Apana\Bundle\MainBundle\EventListener;

use FOS\UserBundle\Event\UserEvent;

class RegistrationListener
{

    public function onUserRegistration(UserEvent $event)
    {
        $user = $event->getUser();
        $url =  strtolower($user->getFirstname().".".$user->getLastname());
        $user->setUrl($url);
    }

}
person Achilles    schedule 18.07.2014
comment
Это хорошее решение, но, как я уже сказал в своем ответе, вам нужно очистить URL-адрес. В противном случае вы можете получить неверный URL-адрес, давайте подумаем, фамилия человека Decò или D'amico. Вы можете получить копию того, как расширение sluggable очищает URL-адрес: github.com/Atlantic18/DoctrineExtensions/blob/master/lib/Gedmo/ - person Filo; 18.07.2014