Symfony2&注释&选择验证:如何存储和检索选项选项?

时间:2012-02-08 09:57:14

标签: validation callback annotations symfony choice

我有一个动态的选项列表要在表单中显示,我只想将它们保存在一个地方,因为这些不是我唯一需要关注的数据集。

要在实体中通过选择验证这些选择 - CallbackValidator,我需要指定一个修复类和函数,其中将返回选项。

这似乎不对,因为我还在学习Symfony2和DIC概念,然后我不希望指定一个具体的回调函数/类,而是一个服务或想到另一种方法来解决这个问题。

我想提供的不是类名,而是服务名称作为回调。我错了吗?

我需要

的选项列表
  • 填写表格
  • 使用注释验证实体
  • 知道在哪里发送电子邮件(稍后)

立即设置:

services.yml - 使用service_container和Form作为服务定义的DataManager(我不知道这是否正确):

services:
  data_manager:
    class:  TestBundle\Service\DataManager
    arguments:
            - "@service_container"
            - %tc_data.list%
  support_type_form:
    class: TestBundle\Form\Type\TicketType
    arguments: ["@service_container"]
    tags:
        - { name: form.type }

表格:

class TicketType extends FormType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $theChoices = $this->getContainer()->get('data_manager')->getTheChoices();
        ...
    }
}

实体:

class Ticket
{
    /**
     * @Assert\NotBlank()
     * @Assert\Choice(callback = {"NotAServiceReference", "getTheChoices"})
     */
    private $the_list_field;
}

所以我有服务中的数据列表,但您如何建议我检索选择以验证实体?

我想到的另一个解决方案是使用回调验证(链接2),但即使在文档中也是如此:

// somehow you have an array of "fake names"
$fakeNames = array();

你是怎么解决这个问题的?

参考文献:

  1. 请参阅:http://symfony.com/doc/current/reference/constraints/Choice.html#supplying-the-choices-with-a-callback-function(点击注释)
  2. 请参阅:http://symfony.com/doc/current/reference/constraints/Callback.html#the-callback-method

1 个答案:

答案 0 :(得分:1)

  1. 避免将service_container传递给您的服务。依赖注入背后的基本思想是只注入那些实际需要的对象。
  2. 因此,对于您的DataManager,您可能只想注入实体管理器。
  3. 对于TicketType,请注入您的DataManager服务。此时,你可以用漂亮的通用方式做$ this-> dataManager-> getChoices()。
  4. 至于在实体内部进行验证,并不确定是否需要。 form-> isValid()已经检查以确保您的选择有效。但我可以理解Assert \ Choices应该能够指定服务的期望。

    从这里开始:http://symfony.com/doc/current/reference/constraints/Callback.html

      

    但是,目前无法将服务指定为约束。要使用服务进行验证,您应该创建自定义验证约束并将新约束添加到您的类中。

相关问题