在 EasyAdmin 3.x 上使用验证组

Nic*_*tos 2 php symfony-forms symfony easyadmin

我想在创建新用户时使用 EasyAdmin 3.x 的验证组来验证每个字段。

\n

我有一个包含namephoneemail字段的 User 实体,并在“创建”组中使用 @UniqueEntity ,因此我可以在 EasyAdmin 外部创建的表单中更新用户。这工作得很好,但当我使用新的组时,我无法找到如何告诉 EasyAdmin 使用默认组和我的创建组我的创建组。

\n

这是带有我所具有的约束的简化用户实体

\n
use Doctrine\\ORM\\Mapping as ORM;\nuse Symfony\\Bridge\\Doctrine\\Validator\\Constraints\\UniqueEntity;\nuse Symfony\\Component\\Validator\\Constraints as Assert;\n\n/**\n * @ORM\\Entity(repositoryClass=LeadRepository::class)\n * @ORM\\HasLifecycleCallbacks()\n * @UniqueEntity(\n *  fields="cellphone",\n *  message="Ya existe un usuario con este n\xc3\xbamero telef\xc3\xb3nico",\n *  groups={"creation"}\n * )\n * @UniqueEntity(\n *  fields="email",\n *  message="Ya existe un usuario con este email",\n *  groups={"creation"}\n * )\n */\nclass Lead\n{\n    /**\n     * @ORM\\Id()\n     * @ORM\\GeneratedValue()\n     * @ORM\\Column(type="integer")\n     */\n    private $id;\n\n    /**\n     * @ORM\\Column(type="string", length=255)\n     * @Assert\\NotBlank\n     */\n    private $name;\n\n    /**\n     * @ORM\\Column(type="bigint", unique=true, options={"unsigned"=true})\n     * @Assert\\NotBlank\n     * @Assert\\Length(\n     *  min = 10,\n     *  max = 10\n     * )\n     */\n    private $phone;\n\n    /**\n     * @ORM\\Column(type="string", length=255, nullable=true)\n     * @Assert\\Email\n     */\n    private $email;\n
Run Code Online (Sandbox Code Playgroud)\n

以及与 EasyAdmin 一起使用的完整 LeadCrudController

\n
<?php\n\nnamespace App\\Controller\\Admin;\n\nuse App\\Entity\\Lead;\nuse EasyCorp\\Bundle\\EasyAdminBundle\\Config\\Action;\nuse EasyCorp\\Bundle\\EasyAdminBundle\\Config\\Actions;\nuse EasyCorp\\Bundle\\EasyAdminBundle\\Config\\Crud;\nuse EasyCorp\\Bundle\\EasyAdminBundle\\Controller\\AbstractCrudController;\nuse EasyCorp\\Bundle\\EasyAdminBundle\\Field\\AssociationField;\nuse EasyCorp\\Bundle\\EasyAdminBundle\\Field\\DateTimeField;\nuse EasyCorp\\Bundle\\EasyAdminBundle\\Field\\EmailField;\nuse EasyCorp\\Bundle\\EasyAdminBundle\\Field\\IntegerField;\nuse EasyCorp\\Bundle\\EasyAdminBundle\\Field\\TelephoneField;\nuse EasyCorp\\Bundle\\EasyAdminBundle\\Field\\TextField;\n\nclass LeadCrudController extends AbstractCrudController\n{\n    public static function getEntityFqcn(): string\n    {\n        return Lead::class;\n    }\n\n    public function configureCrud(Crud $crud): Crud\n    {\n        return $crud\n            ->setEntityLabelInSingular('Lead')\n            ->setEntityLabelInPlural('Lead')\n            ->setSearchFields(['id', 'name', 'cellphone', 'email'])\n            ->setDefaultSort(['createdAt' => 'DESC'])\n        ;\n    }\n\n    public function configureActions(Actions $actions): Actions\n    {\n        return $actions\n            ->disable('delete')\n            ->add(Crud::PAGE_INDEX, Action::DETAIL)\n            ->setPermission(Action::DETAIL, 'ROLE_ADMIN')\n            ->setPermission(Action::INDEX, 'ROLE_ADMIN')\n            ->setPermission(Action::EDIT, 'ROLE_ADMIN')\n            ->setPermission(Action::SAVE_AND_RETURN, 'ROLE_ADMIN')\n            ->setPermission(Action::SAVE_AND_CONTINUE, 'ROLE_ADMIN')\n        ;\n    }\n\n    public function configureFields(string $pageName): iterable\n    {\n        $name = TextField::new('name');\n        $cellphone = TelephoneField::new('cellphone');\n        $email = EmailField::new('email')\n            ->formatValue(\n                function ($value) {\n                    return is_null($value) ? '' : $value;\n                }\n            )\n        ;\n        $createdAt = DateTimeField::new('createdAt');\n        $pincheck = AssociationField::new('pincheck')\n            ->formatValue(\n                function ($value) {\n                    return is_null($value) ? '' : $value;\n                }\n            )\n        ;\n        $stamps = AssociationField::new('stamps');\n        $id = IntegerField::new('id', 'ID');\n\n        if (Crud::PAGE_INDEX === $pageName) {\n            return [$name, $cellphone, $email, $createdAt];\n        }\n        if (Crud::PAGE_DETAIL === $pageName) {\n            return [$id, $name, $cellphone, $email, $createdAt, $pincheck, $stamps];\n        }\n        if (Crud::PAGE_NEW === $pageName || Crud::PAGE_EDIT === $pageName) {\n            $name->setLabel('Nombre y apellido');\n            $cellphone->setLabel('Tel\xc3\xa9fono (solo n\xc3\xbameros)');\n            $email->setLabel('Email (opcional)');\n        }\n        if (Crud::PAGE_NEW === $pageName) {\n            return [$name, $cellphone, $email];\n        }\n        if (Crud::PAGE_EDIT === $pageName) {\n            return [$name, $cellphone, $email];\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Nic*_*tos 5

我在 EasyAdmin git issues 中找到了解决方案:[EA3] 添加验证组 #3690

我必须将setFormOptions方法添加到 crud 配置中

// LeadCrudController
public function configureCrud(Crud $crud): Crud
{
    return $crud
        ...
        ->setFormOptions(['validation_groups' => ['Default', 'creation']], ['validation_groups' => ['Default', 'creation']])
    ;
}
Run Code Online (Sandbox Code Playgroud)