我想知道如何确保我不会从服务器端的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
答案 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