我正在根据登录的用户构建一个带有自定义选项的表单。 目标是发送邀请。
您可以发送的邀请类型由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(),
));
}
...
}
这是我的表格类型
<?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',
));
}
}
表单显示OK,$ this-&gt; getUser()返回我的用户,$ user-&gt; getIsRefFrom()的内容在表单中正确显示。
此外,当我填写表单时,调试工具栏指示我已正确登录。
但是当我验证提交表单时,我收到错误说“错误:在null上调用成员函数getIsRefFrom()”因为显然$ this-&gt; getUser();现在为空。
调试工具栏现在指示n / a(未登录,没有安全上下文......)
此时看起来安全上下文不可用。
更多信息:
这是我的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 }
也许我做错了什么。 我将不胜感激任何帮助或想法。 谢谢。
答案 0 :(得分:0)
所以我终于找到了,如果不是答案,至少是一个解决方案。
首先,似乎我的逻辑(根据谁在将控制器发送到我的formbuilder之前登录控制器计算字段值)并不好。
但即便如此,我的问题仍然存在:提交表单后我的用户仍未通过身份验证。
我最终从BeSimpleSsoAuthBundle切换到更简单(具有讽刺意味)CasAuthBundle,现在一切正常。
感谢那些试图帮助我的人。