簡體   English   中英

Symfony 5 表單變量不存在

[英]Symfony 5 form variable does not exist

我正在嘗試返回一個表單來更新我的用戶實體中的一些屬性

I'm tying to have a single page app, so I'm creating forms, trying to setup their Update functions in a single controller, and to load the forms in separate twig templates that are all loaded in the main "profile" page.

我的整個用戶 controller:

<?php

namespace App\Controller;

use App\Entity\User;
use App\Form\ModifyUserType;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\UserRepository;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\User\UserInterface;

class UserController extends AbstractController
{
    /**
     * @Route("/profile", name="profile", methods={"GET"})
     */
    public function index(): Response
    {
        $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
        return $this->render('profile.html.twig', [
            'controller_name' => 'UserController',
        ]);
    }

    /**
     * @Route("/profile", name="update", methods={"PUT"})
     * @param UserInterface $user
     * @param Request $request
     * @param EntityManagerInterface $em
     * @return Response
     */
    public function updateUser(UserInterface $user, Request $request, EntityManagerInterface $em) : Response
    {
        $userId = $this->getUser()->getId();
        $em = $this->getDoctrine()->getManager();
        $user = $em->getRepository(User::class)->find($userId);
        $form = $this->createForm(ModifyUserType::class, $user);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {

            $user = $form->getData();
            $em->persist($user);
            $em->flush();
            $this->addFlash('success', 'Saved');
            return $this->redirectToRoute('profile');
        }
        return $this->render('modifyUser.html.twig', [
            'updateUser' => $form->createView()
        ]);
    }
}

我的表格類型:

<?php

namespace App\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\LanguageType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ModifyUserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('description', TextareaType::class)
            ->add('MotherLanguage', LanguageType::class)
            ->add('addLanguage', LanguageType::class)
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            // Configure your form options here
        ]);
    }
}

我試圖調用表單的模式:

<!-- Modify User Modal -->
<div class="modal fade" role="dialog" id="editUserModal">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h3 class="modal-title">Modify profile</h3>
                <button class="close" type="button" data-dismiss="modal">&times;</button>
            </div>
            {{ form_start(updateUser) }}
                <input type="hidden" name="_method" value="PUT">

                <div class="modal-body">
                    <div class="form-group">
                        <label for="description">Description</label>
                        {{ form_row(updateUser.description, { 'id': 'description','attr': { 'class' : 'form-control'}}) }}
                        <label for="addNativeLanguage">Add your native language</label>
                        {{ form_row(updateUser.MotherLanguage, { 'id': 'addNativeLanguage','attr': { 'class' : 'form-control'}}) }}
                        </select>
                        <label for="addLanguage">Add other languages you speak</label>
                        {{ form_row(updateUser.addLanguage, { 'id': 'addLanguage','attr': { 'class' : 'form-control'}}) }}
                        </select>
                    </div>
                </div>
                <div class="modal-footer">
                    <button class="btn btn-light">Update</button>
                </div>
            {{ form_end(updateUser) }}
        </div>
    </div>
</div>
<!-- /Modify User Modal -->

更新:將 Controller 修改為以下內容后:

<?php

namespace App\Controller;

use App\Entity\User;
use App\Form\ModifyUserType;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\UserRepository;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\User\UserInterface;

class UserController extends AbstractController
{
    /**
     * @Route("/profile", name="profile", methods={"GET","PUT"})
     */
    public function index(UserInterface $user, Request $request, EntityManagerInterface $em) : Response
    {
        $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
        /*return $this->render('profile.html.twig', [
            'controller_name' => 'UserController',

        ]);*/
        $userId = $this->getUser()->getId();
        $em = $this->getDoctrine()->getManager();
        $user = $em->getRepository(User::class)->find($userId);
        $form = $this->createForm(ModifyUserType::class, $user);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {

            $user = $form->getData();
            $em->persist($user);
            $em->flush();
            $this->addFlash('success', 'Article Created! Knowledge is power!');
            return $this->redirectToRoute('profile');
        }
        return $this->render('profile.html.twig', [
            'user' => $user,
            'updateUser' => $form->createView()
        ]);
    }
}

I'm getting a new error: Too few arguments to function App\Entity\User::addLanguage(), 0 passed in /home/majd/Projects/Symfony/Back/vendor/symfony/property-access/PropertyAccessor.php on line 422 and exactly 1 expected

根據@dutycorpse 的評論,我沒有去房產,而是直接去負責添加語言的 function 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM