Не удалось загрузить текст "text" в файле vendor/symfony/symfony/src/Symfony/Component/Form/FormRegistry.php в строке 91

Я использую Symfony Standard Edition, и все работает в версии Symfony2.X, пока я не обновляю его до 3.0.x-dev.

Даже в новой версии все работает, кроме страницы, которая дает мне ошибку в контроллере:

Не удалось загрузить тип "текст" 500 Внутренняя ошибка сервера - InvalidArgumentException

  • в поставщике /symfony/symfony/src/Symfony/Component/Form/FormRegistry.php at строка 91
  • в FormRegistry → getType ('text') в поставщике /symfony/symfony/src/Symfony/Component/Form/FormFactory.php at строка 84
  • в FormFactory → createNamedBuilder ('flag', 'text', null, array()) в поставщике /symfony/symfony/src/Symfony/Component/Form/FormBuilder.php на линии 106
  • в FormBuilder → create ('flag', 'text', array()) в vendor/symfony/symfony/src/Symfony/Component/Form/FormBuilder.php at строка 267
  • в FormBuilder → resolveChildren() в поставщике /symfony/symfony/src/Symfony/Component/Form/FormBuilder.php at строка 215
  • в FormBuilder → getForm() в src/MyProject/FrontOfficeBundle/Controller/ChallengeController.php at строка 418

В контроллере я использовал этот код:

$form = $this->createFormBuilder()
->add("flag","text")
->add("validate","button")
->getForm();

Даже если я удалю первое добавление ( "флаг", "текст" ), переключатель ошибок:

Не удалось загрузить тип "button"

Поэтому я думаю, что проблема заключается в методе getForm(). Я подсчитал, что для метода createFormBuilder() нужен параметр, поэтому я попытался передать объект Flag, в котором у него много аргументов (флаг, проверка,...).

Проблема не изменила его, как синтаксис был изменен в этой версии, но когда я проверил документацию, я не нашел никаких проблемы в моем синтаксисе.

Версия формы 3.0-dev. Я проверил его в проекте github, и эти файлы являются латтестами. Я использовал

composer update

И я удалил кеш и файлы журналов, но проблема существует.

Спасибо за вашу помощь и извините за мой плохой английский.

Ответ 1

То, что @CarlosGranados означает read the UPGRADE-3.0.md, - это прочитать файл, который сообщает вам, как вам нужно будет изменить свой код от версии 2.x до 3.0, а не как обновить базу кода Symfony. К сожалению, он не упоминает, как справиться с этой проблемой.

Проблема, с которой вы столкнетесь, рассматривается в [UPGRADE-2.8.md](https://github.com/symfony/symfony/blob/2.8/UPGRADE-2.8.md) и вызвана тем, что имена форм text/button устарели в пользу их полностью квалифицированного имени класса (FQCN).

От UPGRADE-2.8.md

Имена типов были устаревшими и будут удалены в Symfony 3.0. Вместо того, чтобы ссылаться на типы по имени, вы должны ссылаться на них по их полностью квалифицированному имени класса (FQCN). С помощью PHP 5.5 или более поздней версии вы можете использовать константу "class" для этого:

До:

$form = $this->createFormBuilder()
    ->add('name', 'text')
    ->add('age', 'integer')
    ->getForm();

После:

use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\TextType;

$form = $this->createFormBuilder()
    ->add('name', TextType::class)
    // or ->add('name', Symfony\Component\Form\Extension\Core\Type\TextType)
    ->add('age', IntegerType::class)
    // or ->add('age', Symfony\Component\Form\Extension\Core\Type\IntegerType)
    ->getForm();

... и он продолжает рассказывать вам больше...

Ответ 2

Наш веб-сервер по-прежнему находится на php 5.3 - поэтому мне нужно найти обходные пути для symfony3, поскольку я не могу использовать TextType:: class на нашем сервере.

Вы можете свести к минимуму свой код в больших формах, установив константу в ссылку на класс:

//use Symfony\Component\Form\Extension\Core\Type\EmailType;
//use Symfony\Component\Form\Extension\Core\Type\TextType;

const textType = 'Symfony\Component\Form\Extension\Core\Type\TextType';
const emailType = 'Symfony\Component\Form\Extension\Core\Type\EmailType';

class ProfileType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('username', textType, array('label' => 'Username'))
            ->add('address1', textType, array('label' => 'Address1'))
            ->add('address2', textType, array('label' => 'Address2'))
            ->add('postcode', textType, array('label' => 'Postcode'))
         ;
    }

Это работает для меня!