【问题标题】:populating ChoiceType with array of constants用常量数组填充 ChoiceType
【发布时间】:2016-05-03 09:21:19
【问题描述】:

使用底层实体中定义的常量数组填充 Symfony 表单选择类型并添加基于相同常量创建断言的最佳方法是什么。 选项名称应存储在数据库中。

我正在使用 Symfony 2.8,这就是我所做的。它工作得很好,但我认为必须有一种更简单的方法来处理所有新的表单功能。

谢谢,汉内斯

实体

class User implements UserInterface, \Serializable
{
    const OCCUPATION_SCHOOL_HIGHER_DEGREE = 'Schülerin/Schüler an Gymnasium';
    const OCCUPATION_SCHOOL_LOWER_DEGREE = 'Schülerin/Schüler an Haupt-/Real- und anderen Schulen';
    const OCCUPATION_WORK_TRAINING = 'Berufsausbildung';
    const OCCUPATION_UNIVERSITY = 'Studium an einer Hochschule';
    const OCCUPATION_WORK_FULLTIME = 'Vollzeiterwerbstätigkeit';
    const OCCUPATION_WORK_PARTTIME = 'Teilzeiterwerbstätigkeit';
    const OCCUPATION_NATIONAL_SERVICE = 'Wehrdienst/Zivildienst/FSJ/FÖJ';
    const OCCUPATION_UNEMPLOYED = 'keine Beschäftigung';
    const OCCUPATION_OTHERS = 'sonstiges';

...
/**
     * @ORM\Column(type="string", length=255, nullable=true)
     * @Assert\NotBlank(message = "Pflichtfeld.")
     * @Assert\Choice(
     *      choices = {
     *          User::OCCUPATION_SCHOOL_HIGHER_DEGREE,
     *          User::OCCUPATION_SCHOOL_LOWER_DEGREE,
     *          User::OCCUPATION_WORK_TRAINING,
     *          User::OCCUPATION_UNIVERSITY,
     *          User::OCCUPATION_WORK_FULLTIME,
     *          User::OCCUPATION_WORK_PARTTIME,
     *          User::OCCUPATION_NATIONAL_SERVICE,
     *          User::OCCUPATION_UNEMPLOYED,
     *          User::OCCUPATION_OTHERS,
     *      },
     *      message = "Bitte wähle einen Eintrag aus der Liste."
     * )
     */
    private $occupation;

...
}

表单类型

class UserRegisterType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array                $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // Occupation
        $builder->add('occupation', ChoiceType::class, array(
                'label' => 'Beschäftigung*',
                'placeholder' => 'Bitte wählen',
                'choices' => array(
                    User::OCCUPATION_SCHOOL_HIGHER_DEGREE => User::OCCUPATION_SCHOOL_HIGHER_DEGREE,
                    User::OCCUPATION_SCHOOL_LOWER_DEGREE => User::OCCUPATION_SCHOOL_LOWER_DEGREE,
                    User::OCCUPATION_WORK_TRAINING => User::OCCUPATION_WORK_TRAINING,
                    User::OCCUPATION_UNIVERSITY => User::OCCUPATION_UNIVERSITY,
                    User::OCCUPATION_WORK_FULLTIME => User::OCCUPATION_WORK_FULLTIME,
                    User::OCCUPATION_WORK_PARTTIME => User::OCCUPATION_WORK_PARTTIME,
                    User::OCCUPATION_NATIONAL_SERVICE => User::OCCUPATION_NATIONAL_SERVICE,
                    User::OCCUPATION_UNEMPLOYED => User::OCCUPATION_UNEMPLOYED,
                    User::OCCUPATION_OTHERS => User::OCCUPATION_OTHERS,
                ),
                'choices_as_values' => true,
            )
        );

... }

【问题讨论】:

    标签: symfony symfony-forms


    【解决方案1】:

    几个月前我发现了这个bundle,我认为它可以满足您的需求。

    您将可能的值存储在您的config.yml 中(您可以使用您的类常量)。然后您可以使用专用的表单类型来检索您的选择并在您的实体中添加验证约束。

    【讨论】:

    • 谢谢阿德里安!我看看他们是怎么做到的。我真的不想为此安装一个捆绑包,但也许我他们已经使用了我可以实施的好解决方案。我更好奇应该如何做到这一点。
    【解决方案2】:

    不确定,如果这能回答你的问题,但从 PHP 5.6 开始(我希望这是正确的版本)你可以将常量创建为数组:

    const OCCUPATION = [
            User::OCCUPATION_SCHOOL_HIGHER_DEGREE,
            User::OCCUPATION_SCHOOL_LOWER_DEGREE,
            ....
        ];
    

    常量职业 = [ OCCUPATION_SCHOOL_HIGHER_DEGREE => 'Schülerin/Schüler an Gymnasium', OCCUPATION_WORK_TRAINING => 'Berufsausbildung', …… ];

    现在你可以直接在你的表单中访问:

    '选择' => 用户::职业

    或者你可以给你写一个getter $user->getOc​​cupation();

    【讨论】:

    • 谢谢 Snirgel。我认为这仅在 PHP 7 中可用。在我的情况下,问题是选择断言需要一个简单的数组symfony.com/doc/current/reference/constraints/…(我认为),在您的示例中,“OCCUPATION_SCHOOL_HIGHER_DEGREE”将存储在数据库中,而不是实际值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多