2
FormHandlerを使用してFormHandlerを使用して、それぞれのサービスを通じてきれいなフォームフローを取得しようとしています。 Expected argument of type "string", "AppBundle\Form\Type\CurrencyType" given
Formformおよび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で常時動作していました
この は、フォームタイプのインスタンスを渡しています。 S3はクラス名しか使用できないため、エラーになります。サービスの定義を変更して、サービスの代わりに文字列を挿入します。少し奇妙ですが、フォームファクトリは完全修飾クラス名に基づいてフォームタイプサービスを使用します。これはあなたが遭遇するいくつかの主要な形式のBCブレークの1つです。フォームのマニュアルを読み直し、S3の作業を始めるのがベストです。 –
Cerad