如何防止Symfony的空值

时间:2016-02-22 13:44:24

标签: php symfony

我想知道如何确保我不会从服务器端的Symfony中的表单中收到空值。我现在使用的代码:

public function insertAction(Request $request)
{           
    $movie = new Movie();

    if($request->get('title') != null)
    {
        $movie->setTitle($request->get('title'));
    }

    if(str_replace('.', '', $request->get('price')) != null)
    {
        $movie->setPrice(str_replace('.', '', $request->get('price')));
    }

    if($request->get('description') != null)
    {
        $movie->setDescription($request->get('description'));
    }

    $em = $this->getDoctrine()->getManager();
    $em->persist($movie);
    $em->flush();
    return $this->redirectToRoute('movies');
}

但每当我发送一个空表单时,我仍然会看到以下错误: An exception occurred while executing 'INSERT INTO movie (title, price, description) VALUES (?, ?, ?)' with params [null, null, null]:SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'title' cannot be null。我该怎么做才能改进我的代码?提前谢谢。

修改:这是我的解决方案:http://pastebin.com/4Z088SNz

2 个答案:

答案 0 :(得分:2)

简短回答:使用validator组件和add a NotNull constraint到您的字段

长答案:正确使用表单组件和验证器组件

1)将NotNull约束添加到您的实体

2)实现这个

$form = $this->createForm(new MovieType(), new Movie());
$form->handleRequest($request);

if($form->isValid()){
  ... persist ...
}

3)MovieType必须通过默认值

映射到您的实体电影

答案 1 :(得分:1)

在您的实体中使用验证。例如:

use Symfony\Component\Validator\Constraints as Assert;

class Movie
{
    /**
     * @Assert\NotNull()
     */
    protected $title;
}

您可以手动验证它:

$validator = $this->get('validator');
$errors = $validator->validate($movie);

if (count($errors) > 0) {
    // do stuff here
}

或使用与Symfony表单组件的集成。

在此处阅读更多内容:http://symfony.com/doc/current/book/validation.html#using-the-validator-service