【发布时间】:2017-01-26 14:10:18
【问题描述】:
我在处理我的联系表格时遇到了问题,虽然是一个简单的表格。我花了很多时间试图找出我的代码出了什么问题,但我一直无法找到出路。我的对象没有接收数据。我遇到以下异常:
执行'INSERT INTO contact (email, name, message, date) VALUES (?, ?, ?, ?)' 时发生异常,参数为 [null, null, null, "2016-09-19 00:08 :48"]:
SQLSTATE[23000]:违反完整性约束:1048 列“电子邮件”不能为空
下面是我的代码:
<form action="{{ path('ap_platform_contact') }}" method="POST" class="marginBottom25px" id="contact">
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="exampleInputEmail1">Email</label>
<input type="email" name="email" class="form-control" id="exampleInputEmail1" placeholder="Votre email">
{{ form_errors(form.email) }}
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="exampleInputPassword1">Nom </label>
<input type="text" name="name" class="form-control" id="exampleInputPassword1" placeholder="Votre nom ou celui de votre société">
{{ form_errors(form.name) }}
</div>
</div>
</div>
<div class="form-group">
<label for="exampleInputEmail1">Message</label>
<textarea id="exampleInputEmail1" class="form-control" name="message" rows="3"></textarea>
{{ form_errors(form.message) }}
</div>
<!--
<div class="form-group">
<div class="g-recaptcha" data-sitekey="6LdICQcUAAAAAMKjB3Cet82jKHwb_4S-ms8Wz-iE"></div>
</div>
-->
<div class="form-group">
<button type="submit" class="btn tf-btn btn-success">{{ 'Envoyer'|trans }}</button>
</div>
</form>
控制器:
public function contactAction(Request $request)
{
// Retrieving POST data
//$postData = $request->request->get('email');
$contact = new Contact();
$form = $this->createForm(new ContactType(), $contact);
if ($form->handleRequest($request)) {
/*if ($this->get('ap_platform.antispam')->isSpam($contact->getMessage())) {
throw new \Exception('The field email is either empty or its content is too short');
}*/
$em = $this->getDoctrine()->getManager();
$em->persist($contact);
$em->flush();
//var_dump($contact->getEmail());exit;
$request->getSession()->getFlashBag()->add('notice', 'Votre message a été envoyé !');
$mailer = $this->get('mailer');
$message = \Swift_Message::newInstance()
->setSubject('Message venant du formulaire de contact de chyqat.com')
->setFrom('chyqat@chyqat.com')
->setTo('patrickbassoukissa@yahoo.fr')
->setBody("Nouveau message provenant de ".$contact->getName()."<br> Adresse Email : <strong>".$contact->getEmail()."</strong> <br>Son message:<br> <i>".$contact->getMessage()."</i>")
;
$mailer->send($message);
}
return $this->render("APPlatformBundle:Public:contact.html.twig", array(
'form' => $form->createView()
));
}
ContactType.php 文件:
class ContactType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('email', 'email')
->add('message', 'textarea')
->add('name', 'text')
;
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Advertproject\PlatformBundle\Entity\Contact'
));
}
/**
* @return string
*/
public function getName()
{
return 'advertproject_platformbundle_contact';
}
}
联系对象:
<?php
/**
* Created by PhpStorm.
* User: Patrick
* Date: 11/30/15
* Time: 11:58 AM
*/
namespace Advertproject\PlatformBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Security\Core\Tests\Validator\Constraints as PasswordValidation;
/**
*
* Class Contact
* @ORM\Table(name="contact")
* @package Advertproject\PlatformBundle\Entity
* @ORM\Entity()
*/
class Contact
{
/**
* @var integer
* @ORM\Column(name="id", type="integer")
* @ORM\Id()
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
* @ORM\Column(name="email", type="string", length=100)
*@Assert\NotBlank(message="Veuillez fournir une adresse email")
* @Assert\Length(max=100)
*/
protected $email;
/**
* @var string
* @Assert\NotBlank()
* @ORM\Column(name="name", type="string", length=100)
*/
protected $name;
/**
* @var string
* @Assert\NotBlank()
* @Assert\Length(max=1000)
* @ORM\Column(name="message", type="string")
*/
protected $message;
/**
* @var \DateTime
* @ORM\Column(name="date", type="datetime")
*/
protected $date;
public function __construct()
{
$this->date = new \Datetime();
}
/**
* Set email
* @Assert\NotBlank()
* @param string $email
* @return Contact
*/
public function setEmail($email)
{
$this->email = $email;
return $this;
}
/**
* Get email
*
* @return string
*/
public function getEmail()
{
return $this->email;
}
/**
* Set name
*
* @param string $name
* @return Contact
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set message
*
* @param string $message
* @return Contact
*/
public function setMessage($message)
{
$this->message = $message;
return $this;
}
/**
* Get message
*
* @return string
*/
public function getMessage()
{
return $this->message;
}
/**
* Set date
*
* @param \DateTime $date
* @return Contact
*/
public function setDate($date)
{
$this->date = $date;
return $this;
}
/**
* Get date
*
* @return \DateTime
*/
public function getDate()
{
return $this->date;
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
}
谁能帮我找出我的代码有什么问题?
下面是我在调用flush()方法之前运行var_dump($form->getData())后得到的结果
object(Advertproject\PlatformBundle\Entity\Contact)#1955 (5) { ["id":protected]=> NULL ["email":protected]=> NULL ["name":protected]=> NULL [ "message":protected]=> NULL ["date":protected]=> object(DateTime)#1956 (3) { ["date"]=> string(26) "2016-09-18 20:49:32.000000 " ["timezone_type"]=> int(3) ["timezone"]=> string(13) "欧洲/伦敦" } }
【问题讨论】:
-
Contact或只有__construct函数中是否有任何设置器? -
@pazulx 你问这个问题是对的,所以我编辑了我的帖子以包含我的联系人对象的完整代码。但是正如你所看到的,我已经正确编写了所有设置器来为联系人属性分配值
-
正如 Yogesh 所指出的,您需要在表单 html 中实际使用正确的表单名称。
-
那些是twig函数,和前端有关,我不确定如果换成简单的HTML或其他模板引擎代码对后端有什么影响。 FOSUserBundle 不使用 Twig 函数,但代码运行良好。不管怎样,我要试试。
-
@PatrickBass - 这不是真的,如果表单元素的名称不正确会产生影响。看看你的树枝模板肯定是这样。证明这一点的简单方法是使用 form_widget() 生成表单字段,生成的字段名称将与您在模板中定义的名称明显不同。此外,您的模板中没有什么特别之处不能使用这些 twig 函数生成 - 所以您最好使用它们而不是与框架对抗。马丁的回答很好地解释了你的问题。
标签: php symfony doctrine-orm