Отправка формы выводит пользователя из системы

В настоящее время я сталкиваюсь с очень запутанной проблемой с Symfony 4 (или даже не с этим, я не знаю). Я настроил систему входа/регистрации вручную, которая отлично работала до сих пор. Я разработал форму, в которой можно создавать филиалы для своей основной компании. Я использовал FormType именно для этого:

<?php

// src/Form/UserType.php
namespace App\Form;

use App\Entity\Filiale;
use App\Entity\Kammer;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;

use Symfony\Bridge\Doctrine\Form\Type\EntityType;

class FilialType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('apothekenname', TextType::class)
            ->add('email', EmailType::class)
            ->add('anrede', TextType::class)
            ->add('titel', TextType::class, array(
                'required' => false
            ))
            ->add('vorname', TextType::class)
            ->add('name', TextType::class)
            ->add('adresszusatz', TextType::class, array(
                'required' => false
            ))
            ->add('strasse', TextType::class)
            ->add('hausnummer', TextType::class)
            ->add('plz', NumberType::class)
            ->add('ort', TextType::class)
            //->add('kammer', TextType::class)
            ->add('kammer', EntityType::class, array(
                'class' => Kammer::class,
                'choice_label' => 'name',
            ))
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Filiale::class,
        ));
    }
}

?>

view, отображающий FormType, выглядит следующим образом, где есть отдельная кнопка, вызывающая модальное диалоговое окно Bootstrap:

<div class="modal fade" id="modal-add-filiale" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
  <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="exampleModalLongTitle">Neue Filialapotheke anlegen</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Schließen">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body">
        {{ form_start(form_add_filiale) }}
            <div class="form-group row">
                <label class="col-xl-3" for="filiale-apothekenname">Apothekenname</label>
                <div class="col-xl-9">
                    {{ form_widget(form_add_filiale.apothekenname) }}
                </div>
            </div>

            <div class="form-group row">
                <label class="col-xl-3" for="filiale-anrede">Anrede</label>
                <div class="col-xl-9">
                    {{ form_widget(form_add_filiale.anrede) }}
                </div>
            </div>

            <div class="form-group row">
                <label class="col-xl-3" for="filiale-titel">Titel</label>
                <div class="col-xl-9">
                    {{ form_widget(form_add_filiale.titel) }}
                </div>
            </div>

            <div class="form-group row">
                <label class="col-xl-3" for="filiale-vorname">Vorname</label>
                <div class="col-xl-9">
                    {{ form_widget(form_add_filiale.vorname) }}
                </div>
            </div>

            <div class="form-group row">
                <label class="col-xl-3" for="filiale-name">Name</label>
                <div class="col-xl-9">
                    {{ form_widget(form_add_filiale.name) }}
                </div>
            </div>

            <div class="form-group row">
                <label class="col-xl-3" for="filiale-strasse">Straße</label>
                <div class="col-xl-9">
                    {{ form_widget(form_add_filiale.strasse) }}
                </div>
            </div>

            <div class="form-group row">
                <label class="col-xl-3" for="filiale-hausnummer">Hausnummer</label>
                <div class="col-xl-9">
                    {{ form_widget(form_add_filiale.hausnummer) }}
                </div>
            </div>

            <div class="form-group row">
                <label class="col-xl-3" for="filiale-adresszusatz">Adresszusatz</label>
                <div class="col-xl-9">
                    {{ form_widget(form_add_filiale.adresszusatz) }}
                </div>
            </div>

            <div class="form-group row">
                <label class="col-xl-3" for="filiale-plz">PLZ</label>
                <div class="col-xl-9">
                    {{ form_widget(form_add_filiale.plz) }}
                </div>
            </div>

            <div class="form-group row">
                <label class="col-xl-3" for="filiale-stadt">Stadt</label>
                <div class="col-xl-9">
                    {{ form_widget(form_add_filiale.ort) }}
                </div>
            </div>

            <div class="form-group row">
                <label class="col-xl-3" for="filiale-email">Email</label>
                <div class="col-xl-9">
                    {{ form_widget(form_add_filiale.email) }}
                </div>
            </div>

            <div class="form-group row">
                <label class="col-xl-3" for="filiale-kammerbezirk">Kammerbezirk</label>
                <div class="col-xl-9">
                    {{ form_widget(form_add_filiale.kammer) }}
                </div>
            </div>

            <button type="submit">Hu</button>
        {{ form_end(form_add_filiale) }}
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Abbrechen</button>
        <button id="modal-add-filiale-save" type="submit" class="btn btn-primary">Speichern</button>
      </div>
    </div>
  </div>
</div>

Функция контроллера, обрабатывающая форму, рендеринг и отправку, выглядит следующим образом:

public function login(Request $request, AuthenticationUtils $authUtils, AuthorizationCheckerInterface $authChecker) {
        $isLoggedIn = ($authChecker->isGranted('ROLE_USER') || $authChecker->isGranted('ROLE_USER_MO'));

        if($isLoggedIn) {
            $filiale = new Filiale();
            $form = $this->createForm(FilialType::class, $filiale);

            $form->handleRequest($request);

            if($form->isSubmitted() && $form->isValid()) {
                $filiale->setUser($this->getUser());

                $em = $this->getDoctrine()->getManager();
                $em->persist($filiale);
                $em->flush();

                return $this->render('default/startpage_loggedin.html.twig', array(
                'breadcrumb' => 'BROTKRUMEN',
                'form_add_filiale' => $form->createView(),
                'toast_finished' => 1,
            ));
            }

            return $this->render('default/startpage_loggedin.html.twig', array(
                'breadcrumb' => 'BROTKRUMEN',
                'form_add_filiale' => $form->createView(),
            ));
        }
        else {
            // get the login error if there is one
            $error = $authUtils->getLastAuthenticationError();

            // last username entered by the user
            $lastUsername = $authUtils->getLastUsername();

            return $this->render('default/startpage_loggedout.html.twig', array(
                'last_username' => $lastUsername,
                'error'         => $error,
            ));
        }
    }

Хотя код организован не идеально, и я, вероятно, упускаю из виду некоторые рекомендации, я все же нахожу проблему, с которой столкнулся, странной. Форма доступна только при входе в систему - когда я нажимаю кнопку, чтобы открыть модальное окно, затем заполняю форму, а затем нажимаю кнопку отправки, я автоматически выхожу из системы, и отображается сообщение об ошибке «неверные учетные данные».

Однако, когда я передаю рендеринг формы и обработку формы новому представлению и новой функции контроллера, код делает именно то, что должен делать, не касаясь вошедшего в систему пользователя.

У меня в основном заканчиваются идеи, и я был бы признателен за любую подсказку, которую вы, ребята, могли бы предложить. Заранее спасибо!

Изменить: Security.yml

security:
    # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
    encoders:
        App\Entity\User:
            algorithm: bcrypt
        legacy_encoder:
            algorithm: md5
            encode_as_base64: false
            iterations: 1

    providers:
        in_memory: { memory: ~ }
        db_provider:
            entity:
                class: App\Entity\User
                property: username

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            #pattern: ^/
            #http_basic: ~

            anonymous: ~
            provider: db_provider

            user_checker: App\Security\UserChecker

            logout:
                path: /logout
                target: /

            form_login:
                login_path: home
                check_path: home

    access_control:
        - { path: ^/motivwelten, roles: ROLE_USER }
        - { path: ^/services/.*, roles: ROLE_USER }
        - { path: ^/shop, roles: ROLE_USER }
        - { path: ^/shop/.*, roles: ROLE_USER }

    erase_credentials: false

person N. M.    schedule 06.02.2018    source источник
comment
Вы можете показать свой security.yml?   -  person Michał G    schedule 06.02.2018
comment
@MichałG Я отредактировал Security.yml в исходном сообщении. Может ли проблема заключаться в том, что я в основном отправляюсь на маршрут login_path без передачи учетных данных, поэтому symfony пытается проверить этого пользователя и терпит неудачу?   -  person N. M.    schedule 06.02.2018
comment
Ваше действие называется login. Какова его маршрутизация?   -  person goto    schedule 06.02.2018
comment
home: путь: / по умолчанию: _controller: 'App\Controller\SecurityController::login'   -  person N. M.    schedule 06.02.2018


Ответы (1)


Хотя это и не было прямым решением исходного вопроса, который я задал, я решил проблему, переместив всю логику, кроме входа в систему, из метода входа в моем контроллере.

Это, вероятно, должно быть лучшей практикой в ​​любом случае. Я считаю, что отправка маршрута /login вызывает событие входа в систему, и, поскольку учетных данных нет, служба не может проверить пользователя и завершает сеанс, отображая также «недействительные учетные данные».

person N. M.    schedule 06.02.2018