2016-07-04 5 views
2

FormHandlerを使用してFormHandlerを使用して、それぞれのサービスを通じてきれいなフォームフローを取得しようとしています。 Expected argument of type "string", "AppBundle\Form\Type\CurrencyType" givenFormformおよびFormHandlerをsymfony3のサービスとして提供する

私は新しいバージョンでこれを操作する方法を本当にわからない: 今の問題は、私はsymfonyの3.0でエラーが出るということです。

に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はクラス名しか使用できないため、エラーになります。サービスの定義を変更して、サービスの代わりに文字列を挿入します。少し奇妙ですが、フォームファクトリは完全修飾クラス名に基づいてフォームタイプサービスを使用します。これはあなたが遭遇するいくつかの主要な形式のBCブレークの1つです。フォームのマニュアルを読み直し、S3の作業を始めるのがベストです。 – Cerad

答えて

0

あなたのフォームハンドラは正しく見えません。 あなたが宣言した:

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

しかし、私は、デフォルトでは信じて、これは文字列です。 その後、次の操作を行います。

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

は「通貨」の代わりに「文字列」に設定しようとすると!

関連する問題