Передача пользовательской переменной для проверки формы

Я пытаюсь передать свою переменную в ограничение в валидаторе формы, но не могу. я делаю так:

$payForm = $this->createForm(new CableTVPayType(), null, array('balance' => $balance));

И в CableTVPayType:

public function getDefaultOptions(array $options)
{
    $maxSumm = $options['balance'] - 100;
    [...]

Он отлично работает, мой maxSumm — это то, что я хочу, но Symfiony проверяет массив $options. «баланс» не является опцией по умолчанию, и жалуйтесь на это:

The option "balance" does not exist 

Есть ли другой, более правильный способ передать пользовательскую переменную на проверку?


person Neka    schedule 10.08.2012    source источник
comment
Кстати, ваш вопрос вводит в заблуждение. Вы спрашиваете о проверке, а примеры кода посвящены передаче пользовательских параметров в тип формы.   -  person Elnur Abdurrakhimov    schedule 10.08.2012


Ответы (2)


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

Например, параметры использования конкретных вещей. Если вы используете конструктор для конкретного экземпляра, все экземпляры получат значение, которое вы передаете конструктору первого экземпляра.

/**
 * @FormType
 */
class PayType extends AbstractType {

    private $someService;

    /**
     * @InjectParams
     */
    public function __construct(SomeService $someService)
    {
        $this->someService = $someService;
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'balance' => 0
        );
    }

    public function getName() 
    {
        return 'pay';
    }
}
$form = $this->createForm('pay', null, array('balance' => $balance));

Обратите внимание, что аннотация @FormType регистрирует тип как службу. Это позволяет вам использовать имя типа вместо создания экземпляра вручную. Это становится еще удобнее, когда тип нуждается в внедрении в него службы. Вы используете только имя — в данном случае pay — вместо чего-то вроде этого:

$form = $this->createForm(new PayType($this->get('some_service')), null, array(
    'balance' => $balance
));
person Elnur Abdurrakhimov    schedule 10.08.2012
comment
Видимо уже не с getDefaultOptions(), а с setDefaultOptions(). В противном случае он говорит: › Параметр no_animal_type не существует. Известные варианты: action, attr, auto_initialize, ... - person Bonswouar; 26.11.2013

С этим покончено!

Создать переменную для класса и передать ей значение через метод построения

class CableTVPayType extends AbstractType {

    private $maxSumm;

    public function __construct($maxSumm) {
        $this->maxSumm = $maxSumm;
    }

Создать форму с аргументом

$payForm = $this->createForm(new CableTVPayType($someValue));

Теперь я могу использовать эту переменную, как хочу, в своей форме.

person Neka    schedule 10.08.2012
comment
Не используйте конструктор для конкретных вещей. Подробности смотрите в моем ответе. - person Elnur Abdurrakhimov; 10.08.2012