Symfony 4.2.3 - Установите ManyToOne Id, когда пользователь регистрируется в почтовом домене - PullRequest
0 голосов
/ 15 февраля 2019

Моя страница

Сущность пользователя:

<?php
s
namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
use App\Validator\Constraints as AssertPerso;

/**
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 * @ORM\Table(name="app_user")
 */
class User implements UserInterface
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne (targetEntity="Formation")
     */
    private $customerName;

    public function getId(): ?int
    {
        return $this->id;
    }

    /**
     * @return CustomerName
     */
    public function getCustomerName()
    {
        return $this->customerName;
    }

    public function setCustomerName($customerName): self
    {
        $this->customerName = $customerName;
        return $this;
    }


}

Сформированный объект:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\FormationRepository")
 */
class Formation
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=180, unique=true)
     */
    private $customerName;

    public function getId(): ?int
    {
        return $this->id;
    }

    /**
     * @return CustomerName
     */
    public function getCustomerName()
    {
        return $this->customerName;
    }

    public function setCustomerName($customerName): self
    {
        $this->customerName = $customerName;

        return $this;
    }

    public function __toString()
    {
        return $this->customerName;
    }

}

и моя форма UserType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('customerName', null, array(
                'label'    => 'Client ',
                'required' => true)
        )
        ->add('submit', SubmitType::class, ['label_format' => "Register", 'attr'=>['class'=>'btn-primary btn-block']]);

    $builder->addEventListener(
        FormEvents::PRE_SET_DATA,
        array($this, 'preSetData')
    );
}

public function preSetData(FormEvent $event)
{

    $form = $event->getForm();
    $user = $event->getData();

         // $form->remove('customerName');


    $user->setEnabled(true);
}

В моей базе данных "формирование" у меня есть customer_name "xxx".

Я хочу, чтобы, когда пользователь регистрировался, установил customer_name_id в моей таблице "user" с доменом электронной почты, если этоадрес электронной почты похож на «xxxx», и если домен этого сообщения не соответствует имени_пользователя, отобразится ошибка

Не могли бы вы мне помочь, пожалуйста?Спасибо


редактировать с ответом Ребру:

Мне удалось сделать пользовательский валидатор, чтобы проверить, является ли домен существующим доменом в «формировании»

public function validate($value, Constraint $constraint)
{
    $mailParts = explode('@', $value);
    $mailParts = explode('.', $mailParts[1]);
    $domain = $mailParts[0];

            if(!$this->entityManager->getRepository(Formation::class)->findBy(array('customerName' => $domain))){
                $this->context->buildViolation($constraint->messageWrongDomain)
                    ->setParameter('{{ value }}', $this->formatValue($value))
                    ->setCode(Email::INVALID_FORMAT_ERROR)
                    ->addViolation();
                return;
            }
}

Но теперь я не знаю, как установить customer_name_id автоматически, когда пользователь регистрируется?

Спасибо

Редактировать 2: Я только что попробовал это для установки customer_name_id в пользовательской таблице.

В моем UserController:

$mailParts = explode('@', $user->getEmail());
            $mailParts = explode('.', $mailParts[1]);
            $domain = $mailParts[0];

            $customerNameId = $entityManager->getRepository(Formation::class)->findBy(array('customerName' => $domain));

            $customerNameId = $customerNameId[0]->getId();

Я получаю следующую ошибку:

Expected value of type "App\Entity\Formation" for association field "App\Entity\User#$customerName", got "integer" instead.

1 Ответ

0 голосов
/ 18 февраля 2019

Хорошо, тогда ваш дизайн не так - кстати.я бы предложил никогда не использовать manytomany над строками.

Правильный путь для достижения этой цели - использовать пользовательские валидаторы ... как описано здесь: https://symfony.com/doc/current/validation/custom_constraint.html

Short:

  • таблица со всеми клиентами (идентификатор, имя, имя_идентификации)
  • таблица со всеми формациями (идентификатор, имя, домен)

В пользовательском валидаторе вы можете разделитьклиенты по электронной почте (взорваться ("@", $ email)) и сравнить это с доменами в таблице формирования.Если он совпадает, валидатор должен вернуть true, иначе false.Если валидатор имеет значение true, вы можете сохранить клиента.

При таком подходе форма никогда не будет действительной, пока она не будет соответствовать пользовательскому валидатору.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...