【问题标题】:Symfony 4: Form as service, inject service : too few argumentsSymfony 4:表单即服务,注入服务:参数太少
【发布时间】:2018-10-08 13:25:18
【问题描述】:

我尝试按照官方说明在我的表单中获得服务: 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 在第 92 行传入 /code/vendor/symfony/form/FormRegistry.php 和 正好 1 个预期

我不明白,我在自动装配调试命令中找到了我的 fomr:

php bin/console debug:autowiring

App\Form\ContratType
App\Form\DataTransformer\ClientToNumberTransformer
App\Form\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);
    }

感谢您的帮助。

【问题讨论】:

  • 您向 Postman 请求的路线在哪里?
  • 调用控制器实例化我的表单的根...看起来像 /api/contrat/add
  • 控制器内的代码,我们可以看到它吗?
  • 我已经添加了这个;)
  • $contrat = new Contrat;您正在创建一个没有参数的对象。

标签: php symfony4


【解决方案1】:

尝试替换

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

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

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

我遇到了同样的问题,但是当我从服务内部构建表单时,我仍然卡住了 ;-)

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    相关资源
    最近更新 更多