2015-09-11 3 views
0

Я пытаюсь проверить с помощью symfony, проверить с Entity of symfony. на RegisterAction, маршрут/regiter ....Symfony 2.7 return object Twig

$errors = $request->getSession()->getFlashBag()->get('errors'); 
    return array(
     'title' => $title , 
     'user' => $user , 
     'login' => $login , 
     'home_categories' => $home_categories , 
     'categories' => $categories , 
     'posts' => $posts , 
     'cities' => $cities , 
     'areas' => $area , 
     'year' => $year, 
     'month' => $month, 
     'day' => $day, 
     'errors' => $errors 
    ); 

на регистр после проверки

$user = New User; 
$validator = $this->get('validator'); 
$errors = $validator->validate($user); 
if (count($errors) > 0) 
{ 
    $request->getSession()->getFlashBag()->add('errors', $errors); 
    return $this->redirect($this->generateUrl('register')); 
} 

на веточке:

{% for error in errors %} <li>{{ error.message }}</li> {% endfor %} 

но я получаю это сообщение:

Метод "сообщение" для объекта "Symfony \ Component \ Validator \ ConstraintViolationList" не существует в И/AppBundle/Ресурсы/мнение/Default/Register.html.twig в строке 187`

Версия - Symfony 2.7.

Благодаря

ответ

1

Вы возвращаете вложенный массив, попробуйте перезапись:

$errors = $request->getSession()->getFlashBag()->get('errors'); 
return array('errors' => $errors); 

к:

return $request->getSession()->getFlashBag()->get('errors', []); 

Второй аргументом является значением по умолчанию, если не существует никакого значения для ключа «ошибки» в flashBag.

Сообщение об ошибке показывает, что переменная error в вашем цикле фактически является ConstraintViolationList. Как ConstraintViolationList реализует iteratorAggregate, вы можете/должны перебирать этот объект. В настоящее время он находится внутри массива с объектом ConstraintViolationList (только?).

Вы можете использовать внутри веточки dump(), чтобы показать вам содержимое переменной.

Пример

Вот простой пример того, как можно использовать ConstraintViolationList

/* @var $errors ConstraintViolationList */ 
$errors = $validator->validate($something); 

/* @var $error ConstraintViolation */ 
foreach($errors as $error) 
{ 
    echo $error->getMessage(); 
} 

Просто убедитесь, что errors переменная в вашей веточке есть на самом деле ConstraintViolationList, он должен работать.

Для получения дополнительной информации: http://symfony.com/doc/current/book/validation.html#using-the-validator-service

+0

the: return array ('errors' => $ errors); это только shourtcut, что у меня есть, –

+0

Не могли бы вы удалить свой ответ и опубликовать его как редактировать? Сейчас это немного неясно. –

+0

спасибо, я редактирую сообщение –

0

Я думаю, что вы заключаете ошибки в другом массиве где-то раньше. Попытайтесь с этим:

{% for error in errors.0 %} 
    <li>{{ error.message }}</li> 
{% endfor %}