Проблемы с Symfony 4.3.1 и FosUserBundle 2.1.2

Для нового проекта я использую Symfony 4.3 и FosUserBundle 2.1. Я успешно установил этот пакет, но когда я пытаюсь его использовать, у меня возникают некоторые проблемы.

Когда я пытаюсь получить доступ на странице входа (http://127.0.0.1:8000/логин), все работает хорошо. Но на странице регистрации у меня есть некоторые ошибки:

Property "superAdmin" does not exist in class "App\Entity\User"

Я пытаюсь добавить свойства superAdmin и group в свою сущность пользователя (не знаю, хорошая ли это идея). Страница отображается корректно. Теперь, когда я пытаюсь отправить форму регистрации, появляются 4 ошибки (все поля заполнены):

  • Это значение не должно быть нулевым. => "данные.пароль"
  • Это значение не должно быть нулевым. => "данные.superAdmin"
  • Это значение не должно быть нулевым. => "данные.группы"
  • Это значение не должно быть нулевым. => "данные.группа"

Совместим ли FosUserBundle с Symfony 4.3? Как решить эти проблемы? Есть ли альтернативы?

Расширяет ли ваша сущность пользователя BaseUser fosuserbundle?

Dylan Delobel 12.06.2019 10:24

Можете ли вы поделиться воспроизводимым примером, вызывающим эту ошибку?

Nico Haase 05.12.2019 13:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
2
1 402
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

вот решение: ==> вы должны добавить $group и $superAdmin в свою сущность User, поэтому вы можете просто установить для $group значение nullable=true, а $superAdmin является логическим, вы можете установить для него значение true или false. NB: вы должны переименовать группу столбцов, потому что эта группа является зарезервированным словом в mysql., я установил их в конструкторе, чтобы вы могли установить их в пользовательской форме, например:

<?php
// src/AppBundle/Entity/User.php

namespace App\Entity;

use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @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(type = "string", nullable=true)
     */
    protected $prenom;
    /**
     * @ORM\Column(type = "boolean")
     */
    protected $superAdmin;
    /**
     * @ORM\Column(name = "giroupy", type = "string", nullable=true)
     */
    protected $group;

    public function __construct()
    {
        parent::__construct();
        $this->superAdmin = false;
        $this->groups = new ArrayCollection();
        // your own logic
        if (empty($this->registerDate)) {
            $this->registerDate = new \DateTime();
        }
    }

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

    public function getPrenom(): ?string
    {
        return $this->prenom;
    }

    public function setPrenom(string $prenom): self
    {
        $this->prenom = $prenom;

        return $this;
    }

    public function getGroup(): ?string
    {
        return $this->group;
    }

    public function setGroup(?string $group): self
    {
        $this->group = $group;

        return $this;
    }

    public function getSuperAdmin(): ?bool
    {
        return $this->superAdmin;
    }


    public function setSuperAdmin($superAdmin): self
    {
        $this->superAdmin = $superAdmin;

        return $this;
    }
}

поэтому после установки пароля вы должны перехватить formEvent для события SUBMIT, чтобы получить объект User, например:

<?php
// src/AppBundle/Form/RegistrationType.php

namespace App\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

class RegistrationType extends AbstractType
{
    private $userPassWordInterface;
    public function __construct(
        UserPasswordEncoderInterface $userPassWordInterface
    )
    {
        $this->userPassWordInterface = $userPassWordInterface;
    }
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('prenom')
        ->addEventListener(
                FormEvents::SUBMIT,
                [$this, 'onSubmit']
            )
        ;
    }

    public function onSubmit(FormEvent $event)
    {
        $user = $event->getData();
        $form = $event->getForm();

        if (!$user) {
            return;
        }
        $passWord = $this->userPassWordInterface->encodePassword($user, $user->getPlainPassword());
        $user->setPassWord($passWord);

        // checks whether the user has chosen to display their email or not.
        // If the data was submitted previously, the additional value that
        // is included in the request variables needs to be removed.

    }

    public function getParent()
    {
        return 'FOS\UserBundle\Form\Type\RegistrationFormType';
    }

    public function getBlockPrefix()
    {
        return 'app_user_registration';
    }

    // For Symfony 2.x
    public function getName()
    {
        return $this->getBlockPrefix();
    }
}

и в безопасности, как:

security:
    # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers

    encoders:
        App\Entity\User: bcrypt

    role_hierarchy:
        ROLE_SUPER_ADMIN: ROLE_ADMIN
        ROLE_ADMIN:       ROLE_USER

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                csrf_token_generator: security.csrf.token_manager

            logout:       true
            anonymous:    true

    # Easy way to control access for large sections of your site
    # Note: Only the *first* access control that matches will be used
    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/, role: ROLE_ADMIN }

поэтому после установки формы входа в свой пакет: config/packages/fos_user.yaml

fos_user:
    db_driver: orm # other valid values are 'mongodb' and 'couchdb'
    firewall_name: main
    user_class: App\Entity\User
    registration:
        form:
            type: App\Form\RegistrationType
    from_email:
        address: "%mailer_user%"
        sender_name: "%mailer_user%"

и не забудьте загрузить маршруты в: config/routes/fos_user.yaml

fos_user:
    resource: "@FOSUserBundle/Resources/config/routing/all.xml"

Проблема намного проще. FOSUserBundle по-прежнему совместим с Symfony 4.3, просто он не работает с настройками автоматической проверки компонента валидатора 4.3, которые включены по умолчанию:

framework:
    validation:
        email_validation_mode: html5

        # Enables validator auto-mapping support.
        # For instance, basic validation constraints will be inferred from Doctrine's metadata.
        auto_mapping:       # <----- REMOVE THIS THIS
            App\Entity\: [] # <-------- AND THIS

В моем случае это решило проблему, но это также означает, что вам нужно установить правила проверки вручную.

Приведет ли это к тому, что объект вообще не будет проверен? Если это так, я думаю, вам следует включить предупреждение вместе с вашим предложением, на случай, если новички, читающие это, не поймут.

TobyG 26.06.2019 09:56

@TobyG добавил предупреждение, может кому поможет

Andrew Alyamovsky 05.12.2019 13:40

Другие вопросы по теме