PHP 和 Symfony 如何使用枚举表单类型正确创建表单,并传递给 twig 模板?

问题描述 投票:0回答:1

我正在尝试为用户创建一个编辑表单,并希望在表单中列出当前用户角色
还想从枚举 Roles 中的所有角色中进行选择。

有一个我的代码示例。 当前错误是“App\Entity\Roles 类的对象无法转换为字符串”,但我尝试了这里的许多示例,但无法运行我的代码。 有人可以向我解释一下正确的方法是怎样做的吗?确实我在某个地方犯了错误,但我无法弄清楚具体在哪里。 我正在使用 PHP 8.1、Symfony 7.1 预先感谢


<?php

use App\Form\UserFormType;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;


namespace Entity;
enum Roles: string
{
    case ADMIN = 'ADMIN';
    case EMPLOYEE = 'EMPLOYEE';
    case CLIENT = 'CLIENT';

    public static function getRole($name)
    {
        return self::tryFrom($name)->value;
    }
}

class User implements UserInterface
{
    /**
     * @var list<string> The user roles
     */
    #[ORM\Column]
    private array $roles = [];

    /**
     * @see UserInterface
     *
     * @return list<string>
     */
    public function getRoles(): array
    {
        return $this->roles;
    }
}

namespace Form;
class UserFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('roles', ChoiceType::class, [
                    'label' => 'role: ',
                    'choices' => Roles::cases(),
                    'choice_value' => function ($choice) {
                        return Roles::getRole($choice);
                    },
                ]
            );
    }
}


class AdminController extends AbstractController
{
    private UserRepository $userRepository;

    public function __construct(EntityManagerInterface $em, UserRepository $userRepository)
    {
        $this->em = $em;
        $this->userRepository = $userRepository;
    }

    #[Route('admin/user_edit/{id}', name: 'admin_user_edit')]
    public function editUser(Request $request, $id): Response
    {
        $user = $this->userRepository->findOneById($id);
        /*
         *  record for roles in DB is {'1': 'ADMIN', '2': 'EMPLOYEE'}
         */
        $form = $this->createForm(UserFormType::class, $user);

        try {
            $form->handleRequest($request);
        } catch (Exception $e) {
            echo 'failed : '.$e->getMessage();
        }

        if ($form->isSubmitted() && $form->isValid()) {
            // TODO process data
        }

        return $this->render('admin/user_edit.html.twig', [
            'user' => $user,
            'form' => $form->createView(),
        ]);
    }
}
php twig php-8.1 symfony7
1个回答
0
投票

您可以尝试 symfony 形式的枚举类型。 https://symfony.com/doc/current/reference/forms/types/enum.html

否则,回答你的问题 Roles::cases() 返回一个枚举数组,而 php 不知道应该如何打印它。 你可以尝试使用

array_column(Roles::cases(), 'name');
© www.soinside.com 2019 - 2024. All rights reserved.