【问题标题】:Could not load type "form" 500 Internal Server Error - InvalidArgumentException无法加载类型“表单”500 内部服务器错误 - InvalidArgumentException
【发布时间】:2016-03-05 15:14:33
【问题描述】:

我在 OpenClassrooms 上传递了course

我创建了一个简单的表单。

控制器:

// 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。

什么类型的“表单”不能加载?可能是什么问题?

【问题讨论】:

    标签: php forms symfony


    【解决方案1】:

    你不应该一开始就使用 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。否则你会遇到更多的异常/错误,你会浪费时间追逐你的尾巴而不是真正学习。 :)

    【讨论】:

      【解决方案2】:

      所以解决方案是阅读 Symfony3 的 SymfonyBook

      代码变成了:

      //...
      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(),
          ));
      
        }
      

      模板的代码没有改变。

      【讨论】:

        【解决方案3】:

        如果您将两个参数传递给 createBuilder,则第一个参数应该是表单类型的 FQDN。 在这种情况下尝试: $formBuilder = $this->get('form.factory')->createBuilder($advert);

        【讨论】:

        • 哪两个参数?为什么你还使用'form.factory'?
        猜你喜欢
        • 2023-03-31
        • 1970-01-01
        • 2010-11-07
        • 1970-01-01
        • 2020-05-27
        • 2019-12-15
        • 1970-01-01
        • 2013-09-01
        • 1970-01-01
        相关资源
        最近更新 更多