Обрабатывать форму на другом маршруте, откуда она построена Symfony 3

Я на самом деле создаю веб-сайт (с Symfony 3), где форма входа в систему находится на главной странице (маршрут /). И я хотел бы обработать эту форму на маршруте / login.

К сожалению, я не знаю, как это сделать, потому что моя форма встроена в indexAction (), а моя loginAction () не видна в $ form, встроенном в index …

/**
* @Route("/", name="home")
*/
public function indexAction()
{
$user = new User();

$form = $this->createFormBuilder($user)
->setAction($this->generateUrl('login'))
->setMethod('POST') //btw is this useless ?? Is it POST by default ?
->add('Login',   TextType::class)
->add('Password',    TextType::class)
->add('save', SubmitType::class, array('label' => 'Sign In'))
->getForm();

return $this->render('ShellCodeHomeBundle:Home:index.html.twig', array (
'login' => '',
'form_signin' => $form->createView(),
));
}

/**
* @Route("/login", name="login")
*/
public function loginAction(Request $request)
{
$user = new User();

//how do I handle the form ????
$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {

$em = $this->getDoctrine()->getManager();
$user = $form->getData();
//...
}

return $this->render('ShellCodeHomeBundle:Home:index.html.twig', array (
'login' => $user->getLogin(),
));
}

Я думаю, что это бесполезно, но я использую веточку и вставляю форму следующим образом:

<div class="col-lg-12" style="text-align: center;">
{{ form_start(form_signin) }}
{{ form_widget(form_signin) }}
{{ form_end(form_signin) }}
</div>

Надеюсь, вы сможете мне помочь! Спасибо !

0

Решение

Не создавайте свою форму в контроллере, это плохая практика, потому что вы не можете использовать этот код повторно.

Вы должны создать свою форму в FormType и определить их как услугу. Таким образом, вы сможете использовать эту форму так часто, как вам нужно.

Взятые из документов, связанных ниже, вот пример для FormType:

namespace AppBundle\Form;

use AppBundle\Entity\Post;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;

class PostType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title')
->add('summary', TextareaType::class)
->add('content', TextareaType::class)
->add('authorEmail', EmailType::class)
->add('publishedAt', DateTimeType::class)
;
}

public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Post::class,
));
}
}

Тогда вы могли бы использовать FormType как в этом примере:

use AppBundle\Form\PostType;

// ...
public function newAction(Request $request)
{
$post = new Post();
$form = $this->createForm(PostType::class, $post);

// ...
}

Для получения подробной информации, проверьте документы

2

Другие решения

Создайте пользовательский тип формы.

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\{
PasswordType, SubmitType, TextType
};
use Symfony\Component\Form\FormBuilderInterface;

class LoginForm extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('Login', TextType::class)
->add('Password', PasswordType::class)
->add('save', SubmitType::class, [
'label' => 'Sign In'
])
;
}
}
2

По вопросам рекламы [email protected]