Symfony 3.2 FOSMessageBundle ‘… / new’ (т.е. создать новое сообщение) выдает ошибку независимо от того, что я делаю

Я не использую 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%'
]

0

Решение

Если вы не используете FOSUSerBundle, то вам нужно сделать следующее:

  1. Создайте класс UserToUsernameTransformer как в руководстве Использование других UserBundles
  2. В 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
    
  3. Зарегистрировать услуги:

    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 }
    
  4. Создайте класс типа формы 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';
    }
    }
    
  5. Создайте класс типа формы 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';
    }
    }
    

Это должно заставить его работать.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]