2016-03-05 13 views
1

我在OpenClassrooms傳遞course未能加載類型「形式」 500內部服務器錯誤 - InvalidArgumentException

我創建了一個簡單的表單。

控制器:

// src/OC/PlatformBundle/Controller/AdvertController.php 

namespace OC\PlatformBundle\Controller; 

use OC\PlatformBundle\Entity\Advert; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class AdvertController extends Controller 
{ 
    public function addAction(Request $request) 
    { 
    // On crée un objet Advert 
    $advert = new Advert(); 

    // On crée le FormBuilder grâce au service form factory 
    $formBuilder = $this->get('form.factory')->createBuilder('form', $advert); 

    // On ajoute les champs de l'entité que l'on veut à notre formulaire 
    $formBuilder 
     ->add('date',  'date') 
     ->add('title',  'text') 
     ->add('content', 'textarea') 
     ->add('author', 'text') 
     ->add('published', 'checkbox') 
     ->add('save',  'submit') 
    ; 
    // Pour l'instant, pas de candidatures, catégories, etc., on les gérera plus tard 

    // À partir du formBuilder, on génère le formulaire 
    $form = $formBuilder->getForm(); 

    // On passe la méthode createView() du formulaire à la vue 
    // afin qu'elle puisse afficher le formulaire toute seule 
    return $this->render('OCPlatformBundle:Advert:add.html.twig', array(
     'form' => $form->createView(), 
    )); 
     } 
    } 

查看:

{# src/OC/PlatformBundle/Resources/views/Advert/form.html.twig #} 

<h3>Formulaire d'annonce</h3> 

<div class="well"> 
    {{ form(form) }} 
</div> 

而我得到的錯誤: 未能加載類型 「形式」 500內部服務器錯誤 - InvalidArgumentException

*本課程是爲Symfony2編寫的,我正在使用Symfony3。

什麼類型的「形式」不能加載它?可能是什麼問題?

回答

4

你不應該使用的Symfony 3開始。該課程明確指出這是針對Symfony的2

您收到唯一的例外可能是由於在Forms的變化。在Symfony 3中,您需要使用FQCN(完全限定的類名稱),而不是表單的實例(或對服務的字符串引用)。換句話說,你的代碼應該是這個樣子:

namespace OC\PlatformBundle\Controller; 

use OC\PlatformBundle\Entity\Advert; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

// Include the FormType you'll be using. 
// If you have a custom FormType, include that one i.e ContactType, MemberType, etc. 
// and then in the `createBuilder` method replace "FormType" with "ContactType" (or whatever the name of the form type class is) 
use Symfony\Component\Form\Extension\Core\Type\FormType; 

class AdvertController extends Controller 
{ 
    public function addAction(Request $request) 
    { 
     .... 
     $formBuilder = $this->get('form.factory')->createBuilder(FormType::class, $advert); 
     .... 
    } 
} 

有因此,有些其他backwards incompatible changes我建議你使用Symfony2的經歷你的課程時間。否則,你會碰到更多的例外/錯誤,你會浪費時間追逐你的尾巴,而不是真正的學習。 :)

0

如果傳遞兩個參數到createBuilder,第一個參數應該是一個FQDN一個表單類型。 在這種情況下嘗試: $ formBuilder = $ this-> get('form.factory') - > createBuilder($ advert);

+1

什麼2個參數?爲什麼你仍然使用'form.factory'? – Oksana

1

因此,解決辦法是閱讀SymfonyBook的Symfony3。

的代碼變成了:

//... 
use Symfony\Component\Form\Extension\Core\Type\DateType; 
use Symfony\Component\Form\Extension\Core\Type\TextType; 
use Symfony\Component\Form\Extension\Core\Type\TextareaType; 
use Symfony\Component\Form\Extension\Core\Type\CheckboxType; 
use Symfony\Component\Form\Extension\Core\Type\SubmitType; 

//... 

public function addAction(Request $request) 
    { 

    $advert = new Advert(); 

    $form = $this->createFormBuilder($advert) 
     ->add('date',  DateType::class) 
     ->add('title',  TextType::class) 
     ->add('content', TextareaType::class) 
     ->add('author', TextType::class) 
     ->add('published', CheckboxType::class) 
     ->add('save',  SubmitType::class, array('label' => 'Create Add')) 
     ->getForm(); 

    return $this->render('OCPlatformBundle:Advert:add.html.twig', array(
     'form' => $form->createView(), 
    )); 

    } 

模板的代碼並沒有改變。