2012-02-08 43 views
2

我有一个动态的选择列表显示在窗体中,我只想将它们保存在一个地方,因为这些不是我必须关心的唯一数据集。Symfony2&Annotations&Choices验证:如何存储和检索选项选项?

要验证实体中的选择 - 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
  1. 避免将service_container您服务。依赖注入背后的基本思想是只注入那些实际需要的对象。
  2. 因此对于您的DataManager,您可能只需要注入实体管理器。
  3. 对于您的TicketType,请注入您的DataManager服务。在这一点上,你可以用一种很好的通用方式来完成$ this-> dataManager-> getChoices()。

就实体内部的验证而言,并不确定是否需要。form-> isValid()已经检查过,以确保你的选择是有效的。但我可以理解Assert \ Choices应该能够指定服务的期望。

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

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

+0

谢谢。这真的有帮助。为1.我避免按照你的建议传递service_container。问题的关键在于,如果我不必每次都为每次测试设置整个容器,那么测试更容易。到2.DataManager现在只注入来自parameters.yml的数据列表。到3.完全按照你的说法,现在看起来很干净。我记住,当我发送这个信息时,我可以编写自己的验证和约束,并确认了我的想法。谢谢! – dazz 2012-02-09 16:35:23