Не удалось загрузить текст "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'))
;
}
Это работает для меня!