SF2形式:错误属性......也没有一个方法"得到

use*_*922 4 php symfony

我尝试与Symfony 2.4.1做一个联系表单,我有以下错误:

Neither the property "contact" nor one of the methods "getContact()", "isContact()", "hasContact()", "__get()" exist and have public access in class "Open\OpcBundle\Entity\Contact". 
Run Code Online (Sandbox Code Playgroud)

我理解这个错误,但我发现在SF2表单文档或Web上有任何解决方法:

控制器代码是:

[..]

class OpcController extends Controller {
public function contactAction(Request $request) {      
  $contact = new Contact();

  $form = $this->createForm(new ContactType(), $contact);

  $form->handleRequest($request);

  return $this->render("OpenOpcBundle:Opc:contact.html.twig",
        array("formu" => $form->createView(),
        )
  );      
}   
}  
Run Code Online (Sandbox Code Playgroud)

联系实体是:

[...] 
class Contact {
  protected $nom;
  protected $courriel;
  protected $sujet;
  protected $msg;

public function getNom() {
  return $this->nom;
}

public function setNom($nom) {
  $this->nom = $nom;
}

public function getCourriel() {
  return $this->courriel;
}

public function setCourriel($courriel) {
  $this->courriel = $courriel;
}

public function getSujet() {
  return $this->sujet;
}

public function setSujet($sujet) {
  $this->sujet = $sujet;
}

public function getMsg() {
  return $this->msg;
}

public function setMsg($msg) {
   $this->msg = $msg;
}  
} 
Run Code Online (Sandbox Code Playgroud)

和Form类代码:

public function buildForm(FormBuilderInterface $builder, array $options) {
  $builder->add('contact');
  ->add('nom', 'text'))
    ->add('courriel', 'email')
    ->add('sujet', 'text')
          ->add('msg', 'textarea')
    ->add('submit', 'submit');
}

public function getName() {
  return "Contact";
}

public function setDefaultOptions(OptionsResolverInterface $resolver) {
  $resolver->setDefaults(array('data_class' => 'Open\OpcBundle\Entity\Contact', ));
}
} 
Run Code Online (Sandbox Code Playgroud)

对这个问题有什么看法吗?谢谢

M K*_*aid 21

您的错误是正确的并且告诉您实体Contact没有contact属性且没有相关的getter setter方法,而在您buildForm()使用了联系$builder->add('contact');属性时,但实体中不存在相关属性,请在实体中首先定义属性

class Contact {
  protected $nom;
  protected $courriel;
  protected $sujet;
  protected $msg;
  protected $contact;

public function getContact() {
  return $this->contact;
}

public function setContact($contact) {
  $this->contact= $contact;
}
/* ...
remaining methods in entity 

*/
}
Run Code Online (Sandbox Code Playgroud)

或者如果它是非映射字段,则必须在构建器中将此字段定义为非映射

$builder->add('contact','text',array('mapped'=>false));
Run Code Online (Sandbox Code Playgroud)

通过上面的定义,您不需要更新您的实体

  • Thanx,'mapped'=> false非常有帮助.为此+1.:) (5认同)
  • @ user3049922如果您不需要删除`add('contact','text',array('mapped'=> false));`来自表单构建器 (3认同)