Проверка Symfony2 & Annotations & Choices: Как сохранить и получить варианты выбора? - PullRequest
2 голосов
/ 08 февраля 2012

У меня есть динамический список вариантов для отображения в форме, и я просто хочу сохранить их в одном месте, так как это не единственные наборы данных, о которых мне нужно заботиться.

Чтобы проверить эти варианты в Entity over choices-CallbackValidator, мне нужно указать класс и функцию исправления, в которых будут возвращаться варианты.

Это кажется неправильным, так как я все еще изучаю Symfony2 и концепцию DIC, и тогда я не ожидал бы указать конкретную функцию / класс обратного вызова, а службу или придумать другой способ решения этой проблемы.

Я хотел бы дать не имя класса, а имя службы в качестве обратного вызова Я здесь не прав?

Мне нужен список опций для

  • заполните форму
  • для проверки сущности с аннотациями
  • чтобы узнать, куда отправлять электронные письма (позже)

Настройте сейчас:

services.yml - DataManager, определенный с помощью service_container и формы как службы (я не знаю, верно ли это):

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 голос
/ 08 февраля 2012
  1. Избегайте передачи service_container вашим услугам. Основная идея внедрения зависимости заключается в том, чтобы внедрить только те объекты, которые действительно необходимы.
  2. Так что для вашего DataManager вы, вероятно, хотите внедрить только менеджер сущностей.
  3. Для вашего TicketType введите сервис DataManager. В этот момент вы можете сделать $ this-> dataManager-> getChoices () хорошим обобщенным способом.

Что касается проверки внутри самой сущности, то на самом деле не уверен, что вам это нужно. Form-> isValid () уже проверит, чтобы убедиться, что ваш выбор действителен. Но я могу понять ожидание, что Assert \ Choices сможет указывать сервис.

Отсюда: http://symfony.com/doc/current/reference/constraints/Callback.html

Однако в настоящее время невозможно указать службу в качестве ограничения. Чтобы проверить использование службы, вы должны создать собственное ограничение проверки и добавить это новое ограничение в ваш класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...