2

我有一个动态的选项列表以显示在表单中,我只想将它们维护在一个地方,因为这些不是我必须关心的唯一数据集。

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

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

我不想给一个类名,而是一个服务名作为回调。我在这里错了吗?

我需要选项列表

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

现在设置:

services.yml - 使用 service_container 定义的 DataManager 和 Form as a service(我不知道这是否正确):

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
4

1 回答 1

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

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

于 2012-02-08T15:00:04.737 回答