Symfony 5 -注意:由于角色的关系,在用户创建表单中数组到字符串的转换



我在解决这个问题时遇到了麻烦,当我进入在Symfony web应用程序中创建用户的页面时,用户控制器抱怨createForm()函数,错误只说"注意:数组到字符串转换"

表单是用crud创建的默认值,实际上所有的东西几乎都是默认的,所以我想不出一个原因,这个东西不像预期的那样工作。

我试着修改表单使用多重选择,但那也不工作。

我试图修改实体中的数据类型,但这甚至不起作用,因为它立即在文件中抛出了一个错误。

这里是UserType.php(表单生成器)
namespace AppForm;
use AppEntityUser;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormExtensionCoreTypeChoiceType;
use SymfonyComponentFormExtensionCoreTypePasswordType;
use SymfonyComponentFormExtensionCoreTypeRepeatedType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;
class UserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('email')
->add('roles', ChoiceType::class, [
'label' => 'Tipo de usuario',
'attr' => [
'multiple' => true,
'class'=>'form-control myselect'
],
'choices'  => [
'Admin' => 'ROLE_ADMIN',
'Usuario' => 'ROLE_USER'
],

])
->add('plainPassword', RepeatedType::class, array(
'type' => PasswordType::class,
'first_options'  => array('label' => 'Password'),
'second_options' => array('label' => 'Repeat Password'),
))
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => User::class,
]);
}
}

Symfony显示错误的断点中的用户控制器:

/**
* @Route("/new", name="user_new", methods={"GET","POST"})
*/
public function new(Request $request, UserPasswordEncoderInterface $passwordEncoder): Response
{
$user = new User();
$form = $this->createForm(UserType::class, $user);  // <-- This is the highlighted part.
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user->setPassword(
$passwordEncoder->encodePassword(
$user,
$form->get('plainPassword')->getData()
)
);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($user);
$entityManager->flush();
return $this->redirectToRoute('user_index', [], Response::HTTP_SEE_OTHER);
}
return $this->render('user/new.html.twig', [
'user' => $user,
'form' => $form->createView(),
]);
}

以及我声明角色变量、getter和setter的片段中的用户实体:

/**
* @ORMColumn(type="json")
*/
private $roles = [];


/**
* @see UserInterface
*/
public function getRoles(): array
{
$roles = $this->roles;
// guarantee every user at least has ROLE_USER
$roles[] = 'ROLE_USER';
return array_unique($roles);
}
public function setRoles(array $roles): self
{
$this->roles = $roles;
return $this;
}

$roles是一个数组,您可以在配置中看到它:

/**
* @ORMColumn(type="json")
*/
private $roles = [];

即使我们有type="json",它也将被用作数组,但在您的数据库中,它将是一个常规的json。

ChoiceType这是一个字符串,所以你不能在$roles中使用它。

您可以添加一个数据转换器(参见类似的响应),以便在select中显示或与实体一起使用时转换值。

最简单的方法是直接在表单类型中使用CallBackTransformer:

use SymfonyComponentFormCallbackTransformer;
$builder->get('roles')
->addModelTransformer(new CallbackTransformer(
fn ($rolesAsArray) => count($rolesAsArray) ? $rolesAsArray[0]: null,
fn ($rolesAsString) => [$rolesAsString]
));

或者如果你不使用PHP 7.4+

$builder->get('roles')
->addModelTransformer(new CallbackTransformer(
function ($rolesAsArray) {
return count($rolesAsArray) ? $rolesAsArray[0]: null;
},
function ($rolesAsString) {
return [$rolesAsString];
}
));

相关内容

  • 没有找到相关文章

最新更新