我创建了一份有关 http 代码的调查问卷,这是 100 代码的示例:
public static function list(): array { return [ [ 'http_message' => 'Continue', 'http_code' => '100' ], [ 'http_message' => 'Switching Protocols', 'http_code' => '101' ], [ 'http_message' => 'Processing', 'http_code' => '102' ], [ 'http_message' => 'Early Hints', 'http_code' => '103' ], ]; }
然后是我的表单类型:
class QuizControllerType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('response', TextType::class, [ 'attr' => ['autofocus' => true] ]) ->add('submit', SubmitType::class, array( 'label' => 'Suivant' )) ; } public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefaults([ // Configure your form options here ]); } }
最后是我的控制器:
<?php namespace App\Controller; use App\Form\QuizControllerType; use App\Service\HttpCodeService; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; class QuizController extends AbstractController { #[Route('/', name: 'app_quiz')] public function index(Request $request): Response { $session = $request->getSession(); $form = $this->createForm(QuizControllerType::class); $indiceQuestion = $request->query->get('question', 0); if (0 === $indiceQuestion) { $session->clear(); $questionsList = InformationCodeService::list(); dump(1,$questionsList); shuffle($questionsList); dump(2,$questionsList); $responses = array_column($questionsList, 'http_code'); $session->set('questionsList', $questionsList); $session->set('responses', $responses); $session->set('responseFromUser', []); } $responseFromUser = $session->get('responseFromUser'); $message = \count($session->get('questionsList')) > $indiceQuestion ? $session->get('questionsList')[$indiceQuestion]['http_message'] : ''; $form->handleRequest($request); if ('' === $message) { dump('je passse'); $results = []; $responses = $session->get('responses'); $questionsList = $session->get('questionsList'); for ($i = 0; $i < count($responseFromUser); $i++) { if ($responseFromUser[$i] === $responses[$i]) { $results[$i] = $responseFromUser[$i]; } } $score = \count($results). ' / '. \count($questionsList); $session->set('score', $score); return $this->redirectToRoute('app_quiz_finish'); } dump(3,$session->get('questionsList')); if ($form->isSubmitted() && $form->isValid()) { dd($session->get('questionsList')); $response = $form->getData()['response']; $responseFromUser[] = $response; $session->set('responseFromUser', $responseFromUser); $indiceQuestion++; dd($indiceQuestion); return $this->redirectToRoute('app_quiz', ['question' => $indiceQuestion]); } return $this->render('quiz/index.html.twig', [ 'form' => $form->createView(), 'message' => $message, 'indice_question' => $indiceQuestion, 'total_question' => \count($session->get('questionsList')) ]); } #[Route('/finish', name: 'app_quiz_finish')] public function finish(): Response { return $this->render('quiz/finish.html.twig'); } }
在 url https://127.0.0.1:8001/
的索引页上,我的第一个转储按顺序打印数组,转储 2 和 3 打乱顺序打印:
array:4 [▼ 0 => array:2 [▼ "http_message" => "Early Hints" "http_code" => "103" ] 1 => array:2 [▼ "http_message" => "Processing" "http_code" => "102" ] 2 => array:2 [▼ "http_message" => "Continue" "http_code" => "100" ] 3 => array:2 [▼ "http_message" => "Switching Protocols" "http_code" => "101" ] ]
但是当我提交表单时,dd 再次打印我的数组随机播放:
array:4 [▼ 0 => array:2 [▼ "http_message" => "Processing" "http_code" => "102" ] 1 => array:2 [▼ "http_message" => "Switching Protocols" "http_code" => "101" ] 2 => array:2 [▼ "http_message" => "Continue" "http_code" => "100" ] 3 => array:2 [▼ "http_message" => "Early Hints" "http_code" => "103" ] ]
我不明白为什么要这样做。如果我删除 dd
,提交表单后,我将使用不同的数组重定向到 https://127.0.0.1:8001/?question=1
,如果我再次提交,我将重定向到 https://127.0.0.1 :8001/?question=2
但这一次使用与上一页相同的数组,并且数组不再随机。
所以这意味着我的数组被洗牌两次:
但我只想在到达本地主机页面时将数组随机播放一次
我不知道为什么它会这样,如果你有任何想法,那将是一种乐趣
当您提交表单时,您没有传递
question
参数。所以代码设置默认值
$indiceQuestion = 0
,再次陷入数组打乱的情况。您可以像这样转换条件
或检查其他条件,例如
$session->get('questionsList')
中是否存在值