2016-07-04 2 views
2

Итак, я пытаюсь использовать FormType с FormHandler через их соответствующие службы, чтобы получить довольно чистый поток формы. Теперь проблема заключается в том, что я получаю сообщение об ошибке в 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' 
     )); 
    } 
} 

Форма Handler:

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

Этот <аргумент type = "service" id = "app.currency.form.type" /> передает экземпляр вашего типа формы. S3 может использовать только имя класса, следовательно, ошибку. Измените определение службы, чтобы ввести строку вместо службы. Это немного странно, но фабрика форм затем использует вашу службу типа формы на основе полного имени класса. Это один из нескольких основных разрывов bc, с которыми вы столкнетесь. Лучше всего перечитать руководство по формам и в значительной степени начать для S3. – Cerad

ответ

0

Ваш обработчик формы не выглядит правильным. Вы заявили:

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

Но я считаю, по умолчанию является строка. Тогда вы сделаете это:

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

Попытка установить его на «Валюта» вместо «строка»!

Смежные вопросы