Symfony 4: Форма как сервис, инжект сервис: слишком мало аргументов - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь получить услугу в своей форме, следуя официальным инструкциям: https://symfony.com/doc/current/form/form_dependencies.html

это мои services.yaml:

services:
    # default configuration for services in *this* file
    _defaults:
        autowire: true      # Automatically injects dependencies in your services.
        autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
        public: false      
class name
    App\:
        resource: '../src/*'
        exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
class
    App\Controller\:
        resource: '../src/Controller'
        tags: ['controller.service_arguments']

App\Service\:
    resource: '../src/Service/*'

App\Form\:
    resource: '../src/Form/*'

моя форма выглядит следующим образом:

<?php
namespace App\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;

use Doctrine\Common\Persistence\ObjectManager;

use App\Entity\Contrat;
use App\Entity\Society;
use App\Entity\Client;
use App\Form\DataTransformer\ClientToNumberTransformer;
use App\Form\DataTransformer\SocietyToNumberTransformer;



class ContratType extends AbstractType{

    private $manager;

    public function __construct(SocietyToNumberTransformer $manager){ // this is the breakpoint from error
        $this->manager = $manager;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('...')
            ...
        ;
        // Old fashion way for testing only ...
        $builder->get('client')->addModelTransformer(new ClientToNumberTransformer($this->manager));
        $builder->get('society')->addModelTransformer(new SocietyToNumberTransformer($this->manager));
    }

    public function configureOptions(OptionsResolver $resolver){
        $resolver->setDefaults(array(
            'data_class' => Contrat::class,
        ));
    }

Это выглядит симпатично ... Когда я проверяю это с почтальоном, я получаю эту ошибку:

Слишком мало аргументов для функции App \ Form \ ContratType :: __ construct (),0 передано в /code/vendor/symfony/form/FormRegistry.php в строке 92 и ровно 1 ожидается

Я не понимаю, я нашел свой fomr в команде отладки autowiring:

php bin/console debug:autowiring

Приложение \ Форма \ ContratType
Приложение \ Форма \ DataTransformer \ ClientToNumberTransformer
Приложение \ Форма \ DataTransformer \ SocietyToNumberTransformer

и контроллер:

  public function addContrat(Request $request, FormData $formData){

        $em = $this->getDoctrine()->getManager('default');

        $data = $formData->getRequestData($request);
        var_dump($data);

        $contrat = new Contrat;
        $form = $this->factory->createBuilder(ContratType::class, $contrat)->getForm();

        $form->submit($data);

        if($form->isValid()){
            $em->persist($contrat);
            $em->flush();

            return $this->response(
                $this->serialize(
                    $contrat, 
                    ['group1']
                )
            );
        }
        return $this->response('error', 500);
    }

спасибо за помощь.

1 Ответ

0 голосов
/ 16 ноября 2018

Попробуйте заменить

$form = $this->factory->createBuilder(ContratType::class, $contrat)->getForm();

на

$form = $this->createForm(ContratType::class, $contrat);

https://symfony.com/doc/current/forms.html#creating-form-classes

У меня возникла та же проблема, но при создании формы из службыЯ все еще застрял; -)

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...