2
所以我试图通过FormHandler通过它们各自的服务来使用FormType来获得相当干净的Form流。 现在的问题是,我在Symfony 3.0中出现错误: Expected argument of type "string", "AppBundle\Form\Type\CurrencyType" given
FormType和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中始终工作
这个 正在传递您的表单类型的一个实例。 S3只能使用一个类名,因此会出错。将您的服务定义更改为注入字符串而不是服务。这有点奇怪,但表单工厂将使用基于完全限定类名的表单类型服务。这是您会遇到的几种主要形式的休息时间之一。最好重新阅读表格上的手册,几乎从S3开始。 –
Cerad