2016-07-04 37 views
2

所以我试图通过FormHandler通过它们各自的服务来使用FormType来获得相当干净的Form流。 现在的问题是,我在Symfony 3.0中出现错误: Expected argument of type "string", "AppBundle\Form\Type\CurrencyType" givenFormType和FormHandler作为Symfony3中的服务

我不太确定如何在新版本中使用它。

的FormType:

/** 
* Class CurrencyType 
* @package AppBundle\Form\Type 
*/ 
class CurrencyType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('displayName', TextType::class) 
      ->add('symbol', TextType::class) 
      ->add('save', SubmitType::class, array('label' => 'Voeg Currency toe')) 
     ; 
    } 

    public function setDefaultOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\Currency' 
     )); 
    } 
} 

表单处理程序:

class CurrencyFormHandler 
{ 
    /** 
    * @var Request 
    */ 
    protected $requestStack; 

    /** 
    * @var CurrencyManager 
    */ 
    protected $currencyManager; 

    /** 
    * @var FormInterface 
    */ 
    protected $form; 

    /** 
    * CurrencyFormHandler constructor. 
    * @param FormInterface $form 
    * @param RequestStack $requestStack 
    * @param CurrencyManager $currencyManager 
    */ 
    public function __construct(FormInterface $form, RequestStack $requestStack, CurrencyManager $currencyManager) 
    { 
     $this->form = $form; 
     $this->requestStack = $requestStack; 
     $this->currencyManager = $currencyManager; 
    } 

    /** 
    * Process the form 
    * 
    * @param Currency|null $currency 
    * @return bool 
    */ 
    public function process(Currency $currency = null) 
    { 
     if (null === $currency) { 
      $holiday = $this->currencyManager->create(); 
     } 
     $this->form->setData($currency); 
     $this->form->handleRequest($this->requestStack->getCurrentRequest()); 
     if ($this->form->isValid()) { 
      $this->onSuccess($currency); 
      return true; 
     } 
     return false; 
    } 

    /** 
    * When the form is succesfully posted 
    * 
    * @param Currency $currency 
    */ 
    public function onSuccess(Currency $currency) 
    { 
     $this->currencyManager->save($currency); 
    } 
} 

的服务:

<service id="app.currency.form" class="Symfony\Component\Form\Form"> 
      <argument>app_currency</argument> 
      <argument type="service" id="app.currency.form.type" /> 
      <factory method="createNamed" service="form.factory" /> 
     </service> 
     <service id="app.currency.form.type" class="AppBundle\Form\Type\CurrencyType"> 
      <tag name="form.type" alias="currencyform"/> 
     </service> 
     <service id="app.currency.form.handler" 
       class="AppBundle\Form\Handler\CurrencyFormHandler"> 
      <argument type="service" id="app.currency.form" /> 
      <argument type="service" id="request_stack" /> 
      <argument type="service" id="app.currency.manager"/> 
     </service> 

而且控制器:

/** 
* Class AddController 
* @package AppBundle\Controller\Currency 
*/ 
class AddController extends Controller 
{ 
    /** 
    * @Route("/currency/add", name="currency_add") 
    * @param Request $request 
    * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response 
    */ 
    public function indexAction(Request $request) 
    { 
     $form = $this->get('app.currency.form'); 
     $formHandler = $this->get('app.currency.form.handler'); 
     $process = $formHandler->process(); 

     if ($process) { 
      $this->get('session')->getFlashBag()->add('success', 'Currency succesvol toegevoegd'); 
      return $this->redirect($this->generateUrl('currency_overview')); 
     } 

     return $this->render(':currency:add.html.twig', [ 
      'form' => $form->createView(), 
     ]); 
    } 
} 

那么究竟是什么错误呢?这用于在Symfony 2中始终工作

+1

这个正在传递您的表单类型的一个实例。 S3只能使用一个类名,因此会出错。将您的服务定义更改为注入字符串而不是服务。这有点奇怪,但表单工厂将使用基于完全限定类名的表单类型服务。这是您会遇到的几种主要形式的休息时间之一。最好重新阅读表格上的手册,几乎从S3开始。 – Cerad

回答

0

您的表单处理程序看起来不正确。 您声明:

/** 
* @var CurrencyManager 
*/ 
protected $currencyManager; 

但是,我相信默认情况下是一个字符串。 然后,你这样做:

public function onSuccess(Currency $currency) 
{ 
    $this->currencyManager->save($currency); 
} 

试图将其设置为“货币”,而不是“字符串”!