Я не использую FOSUserBundle (там уже есть пользовательский код / код безопасности). Я следил за документами Вот.
После долгих поисков и поисков в файлах Symfony и FOSMessageBundle я пришел к выводу, что проблема связана с новым классом NewThreadMessageFormFactory. У него только один метод. Если я оставлю это как есть
public function create()
{
return $this->formFactory->createNamed(
$this->formName,
$this->formType,
$this->createModelInstance());
}
Я получаю эту ошибку Expected argument of type "string", "AppBundle\Service\NewThreadMessageFormType" given
, С другой стороны, если я сделаю следующее,
public function create()
{
return $this->formFactory->createNamed(
$this->formName,
'AppBundle\Service\NewThreadMessageFormType',
$this->createModelInstance());
}
Я понял Could not load type "FOS\UserBundle\Form\Type\UsernameFormType
, Которого, конечно, даже не существует, потому что FOSUserBundle даже не установлен.
Я уже потратил более десятка часов на это. Я многому научился в процессе, но я все еще не могу заставить эту чертову вещь работать …
И моя текущая конфигурация
//config.yml
fos_message:
db_driver: orm
thread_class: AppBundle\Entity\Thread
message_class: AppBundle\Entity\Message
new_thread_form:
type: app.new_thread_form_type
factory: app.new_thread_form_factory
а также…
//services.yml
fos_user.user_to_username_transformer:
alias: app.user_to_username_transformer
app.user_to_username_transformer:
class: AppBundle\Form\DataTransformer\UserToUsernameTransformer
arguments:
type: "service"id: "doctrine"
app.new_thread_form_type:
class: AppBundle\Service\NewThreadMessageFormType
arguments: ['@app.user_to_username_transformer']
tags:
- {name: form.type}
app.new_thread_form_factory:
class: AppBundle\Service\NewThreadMessageFormFactory
arguments: [
'@form.factory',
'@fos_message.new_thread_form.type',
'%fos_message.new_thread_form.name%',
'%fos_message.new_thread_form.model%'
]
Если вы не используете FOSUSerBundle, то вам нужно сделать следующее:
В config.yml:
fos_message:
db_driver: orm
thread_class: AppBundle\Entity\Thread
message_class: AppBundle\Entity\Message
new_thread_form:
type: AppBundle\Form\Type\NewThreadMessageFormType
Зарегистрировать услуги:
app.user_to_username_transformer:
class: AppBundle\Form\DataTransformer\UserToUsernameTransformer
arguments: ['@doctrine']
fos_user.user_to_username_transformer:
alias: app.user_to_username_transformer
app.form.type.username:
class: AppBundle\Form\Type\UsernameFormType
arguments: ['@app.user_to_username_transformer']
tags:
- { name: form.type }
Создайте класс типа формы NewThreadMessageFormType, чтобы переопределить класс по умолчанию.
class NewThreadMessageFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('recipient', UsernameFormType::class, array(
'label' => 'recipient',
'translation_domain' => 'FOSMessageBundle',
))
->add('subject', TextType::class, array(
'label' => 'subject',
'translation_domain' => 'FOSMessageBundle',
))
->add('body', TextareaType::class, array(
'label' => 'body',
'translation_domain' => 'FOSMessageBundle',
));
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'intention' => 'message',
));
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'new_thread_message';
}
}
Создайте класс типа формы UsernameFormType для обработки преобразования и отображения имени пользователя.
class UsernameFormType extends AbstractType
{
/**
* @var UserToUsernameTransformer
*/
protected $usernameTransformer;
/**
* Constructor.
*
* @param UserToUsernameTransformer $usernameTransformer
*/
public function __construct(UserToUsernameTransformer $usernameTransformer)
{
$this->usernameTransformer = $usernameTransformer;
}
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addModelTransformer($this->usernameTransformer);
}
/**
* {@inheritdoc}
*/
public function getParent()
{
return TextType::class;
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'toolsets_username_type';
}
}
Это должно заставить его работать.
Других решений пока нет …