this->getUser() 验证表单后返回 null

Bor*_*cey 5 symfony

我正在构建一个基于谁登录的自定义选项的表单。目标是发送邀请。

您可以发送的邀请类型由 getIsRefFrom() 方法决定(该方法可用于“用户”对象。)

这是我的控制器

<?php

namespace AppBundle\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use AppBundle\Entity\Invitation;
use AppBundle\Form\InvitationType;
use AppBundle\Entity\User;
use Symfony\Component\HttpFoundation\Response;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;

/**
 * Invitation controller.
 *
 * @Route("/private/invitation")
 */
class InvitationController extends Controller 
{
...
    public function newAction(Request $request)
    {

        $invitation = new Invitation();
        $user = $this->getUser();
        $userStruct = $user->getIsRefFrom();
        $form = $this->createForm('AppBundle\Form\InvitationType', $invitation, array('userStruct' => $userStruct));         

        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {     

            return new Response("<body>Hi</body>");

        }

        return $this->render('invitation/new.html.twig', array(
            'invitation' => $invitation,
            'form' => $form->createView(),
        ));
    }

...
}
Run Code Online (Sandbox Code Playgroud)

这是我的表格类型

<?php

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;

class InvitationType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {       

        $builder
             //showing content of userStruct in a select field
            ->add('structure', EntityType::class,  array(
                    'label' => 'Structure:',
                    'class' => 'AppBundle:Structure',
                    'choices' => $options['userStruct'],
                    'placeholder' => 'Faites un choix',
                    'property' => 'libelle',
                    'mapped' => false
            ))


        ->add('destinataire');
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Invitation',
            'userStruct' => 'AppBundle\Entity\Structure',
        ));
    }
}
Run Code Online (Sandbox Code Playgroud)

表单显示OK,$this->getUser()返回我的用户,$user->getIsRefFrom()的内容正确显示在表单中。

此外,调试工具栏指示我已正确登录,因为我填写了表格。

但是当我验证提交表单时,我收到一条错误消息“错误:在 null 上调用成员函数 getIsRefFrom() ”,因为显然 $this->getUser(); 现在为空。

调试工具栏现在指示 n/a(未登录,没有安全上下文...)

看起来安全上下文此时不可用。

更多信息 :

  • 我使用 be_simple_sso_auth(cas auth 包)。
  • 我只有一个防火墙 (derriere_CAS),它覆盖了整个应用程序,除了通过 ACL 启用的登录页面(请参阅下面的 security.yml)
  • 身份验证工作正常。

这是我的 security.yml

security:
  encoders:
    AppBundle\Entity\User: 
      algorithm: bcrypt

  role_hierarchy:
        ROLE_ADMIN: [ROLE_USER]

  providers:
    users:
      entity: {class: AppBundle\Entity\User, property: username } 



  firewalls:
        # disables authentication for assets and the profiler, adapt it according to your needs
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        derriere_CAS:
            methods: GET
            pattern: ^/
            anonymous: ~
            trusted_sso:
              manager: connect_sso 
              login_path: /private/login/
              check_path: /private/login/check
              login_action: false
              logout_action: false
              create_users: true
              created_users_roles: [ 'ROLE_USER' ]
              failure_path: /erreur_identification
            logout:
              path: /logout_sso
              target: /

  access_control:
      - { path: ^/private/login, role: IS_AUTHENTICATED_ANONYMOUSLY } 
      - { path: ^/, roles: IS_AUTHENTICATED_FULLY }  
Run Code Online (Sandbox Code Playgroud)

也许我做错了什么。我将不胜感激任何帮助或想法。谢谢你。

Bor*_*cey -1

所以我终于找到了,即使没有答案,至少也找到了解决方案。

首先,我在这里的逻辑(根据在控制器中登录的人计算字段值,然后将其发送到我的表单构建器)似乎不好。

正确的方法如下所示:http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#cookbook-form-events-user-data

但即便如此,我的问题仍然存在:我的用户在提交表单后仍然没有经过身份验证。

我最终从 BeSimpleSsoAuthBundle 切换到更简单(讽刺的是)CasAuthBundle,现在一切正常。

感谢那些试图帮助我的人。