Проверка формы Symfony2 без createFormBuilder

Я пытаюсь проверить форму, созданную мной в файле .twig. Я не создаю форму с использованием createFormBuilder. Это мой код контроллера, который вызывается для обоих случаев 1) для представления 2) после отправки формы.

public function cart_newAction(Request $request)
 {      
    $entity = new Product();
    $errors = '';
    if ($request->getMethod() == 'POST') 
    {
        $validator = $this->get('validator');
        $errors = $validator->validate($entity);
        if (count($errors) > 0) {
            echo 'Error';
        } 
        else {
            echo 'Success';             
        }
    }
    return $this->render('CartCartBundle:Cart:Add.html.twig', array('errors' => $errors ));
}

это файл просмотра, и я показываю такие ошибки Add.html.twig

{% for error in errors %}
    {{error}}
{% endfor %}

Я установил ошибку в файле validation.yml для имени, которое не может быть пустым. Итак, теперь, когда я запускаю страницу просмотра, она каждый раз показывает ошибку после отправки формы. Если ошибки нет, она не должна отображать мне ошибку, просто отображается пустая ошибка.

Note:Есть ли лучший способ сделать это, поделитесь им. Помните, что я делаю это без createFormBuilder ОБНОВЛЕНИЕ. Он всегда показывает мне ошибку. Даже если моя форма действительна и не пропущено ни одного поля .


person Azam Alvi    schedule 11.03.2014    source источник
comment
Какой у Вас вопрос?   -  person xdazz    schedule 11.03.2014
comment
@xdazz на самом деле мне нужна проверка формы Я не использую createFormBuilder, так как я могу это сделать. Работа, которую я проделал, не работает должным образом   -  person Azam Alvi    schedule 11.03.2014
comment
not working properly недостаточно, чтобы описать вашу проблему. Не могли бы вы подробно описать.   -  person xdazz    schedule 11.03.2014
comment
Ошибка не исчезает, когда я не пропускаю поля формы. Он не должен отображать ошибки, но он всегда выдает ошибку, даже в первый раз, когда я просматриваю страницу, на которой тоже отображается ошибка.   -  person Azam Alvi    schedule 11.03.2014
comment
Где код, который вы устанавливаете для свойства сущности?   -  person xdazz    schedule 11.03.2014
comment
Код выше, который я установил в DefaultController   -  person Azam Alvi    schedule 11.03.2014
comment
@xdazz Я обновил вопрос.   -  person Azam Alvi    schedule 11.03.2014
comment
Если мне чего-то не хватает, я не вижу, где вы привязываете свою сущность к своему запросу в методе контроллера, поэтому, насколько я могу видеть из приведенного выше кода, вы проверяете вновь созданную (то есть пустую) сущность.   -  person Darragh Enright    schedule 11.03.2014
comment
У вас есть formType для вашей сущности? потому что, если он у вас есть, вы можете лучше проверить свою форму.   -  person famas23    schedule 06.11.2018
comment
Не могли бы вы @Azam Alvi Werlich принять мой ответ или проголосовать за него, если вы считаете, что он решил вашу проблему или помог найти решение. Спасибо. Ваше здоровье!   -  person famas23    schedule 10.12.2018


Ответы (3)


Если вы хотите создать форму самостоятельно, вы не сможете проверить ее с помощью валидатора формы Syfmony. Вам нужно использовать простую проверку PHP на стороне сервера. Что-то вроде этого

if ($request->getMethod() == 'POST') 
{
    $username = $_POST['username'];
    if ($username == '')
    {
       // set error message here
    } 
}
person Community    schedule 17.12.2014

Хорошо, позвольте мне прояснить. Я дам вам решения для буксировки, первый из них - лучший и наиболее подходящий способ: 1) Создайте вашу команду EntityForm Type: bin/console make:form или d:g:form. 2) Затем просто добавьте несколько строк для отправки и получите ошибки.

 public function cart_newAction(Request $request)
 {      
    $entity = new Product();
    $form = $this->createForm(EntityType::class, $entity);
    $form->submitForm($request->request->all(), false);

    if ($request->getMethod()->isPost()) 
    {
    if ($form->isValid()) {
            echo 'Error';
        } 
        else {
            echo 'Success';             
        }
    }
    return $this->render('CartCartBundle:Cart:Add.html.twig', [
         'errors' => $form->getErrors(),
    ]);
}

Второе решение - привязать ваши данные к вашему объекту сущности, потому что нам нужно установить данные в наш объект.

1) Сначала создайте private fonction в вашем текущем классе, чтобы связать все отправленные данные:

private function bindEntityValues(Product $entity, array $data) {
  foreach ($data as $key => $value){
    $funcName = 'set'+ucwords($key);
    if(method_exists($entity, $funcName)) $entity->$funcName($value);
  }
}

Тогда ваше действие cart_newAction должно быть таким:

 public function cart_newAction(Request $request)
 {      
    $entity = new Product();
    $this->bindEntityValues(entity, $request->request->all());
    $errors= $this->get('validator')->validate($entity)

    if (count($errors) > 0) {
            echo 'Error';
        } 
        else {
            echo 'Success';             
        }
    }
    return $this->render('CartCartBundle:Cart:Add.html.twig', ['errors' => $errors]);
}

Желаю, чтобы это помогло вам обрести ясное видение.

person famas23    schedule 06.11.2018

Вы должны проверить, пуст ли $errors:

if (count($errors) > 0) {
    return $this->render('CartCartBundle:Cart:Add.html.twig', array('errors' => $errors ));
} else {
    return $this->render('CartCartBundle:Cart:Add.html.twig');
}

См. Документ здесь.

person ncrocfer    schedule 11.03.2014