Major Productions
Major Productions

Reputation: 6062

Symfony 3.4 - redirect after posting/saving info in DB not working

I have the following controller method which creates a new Category entity and persists it to the database:

/**
     * @param Request $request
     *
     * @return array
     *
     * @Route("/admin/category/new", name="_admin_category_new")
     * @Method({"GET", "POST"})
     * @Template("Admin/category_new.html.twig")
     */
    public function newCategoryAction(Request $request)
    {
        $category = new Category();

        $form = $this->createForm(CategoryType::class, $category);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($category);

            if (!$category->getSlug()) {
                $category->setSlug();
            }

            if ($category->getFile() != null) {
                $um = $this->get('stof_doctrine_extensions.uploadable.manager');
                $um->markEntityToUpload($category, $category->getFile());
            }

            $em->flush();

            $this->addFlash('success', 'Category successfully created');

            $this->redirect($this->generateUrl('_admin_category', array('page' => 1)));
        }

        return array('form' => $form->createView());
    }

Upon successful completion, it's supposed to redirect the user to a different URL. Instead, it just re-displays the current page/form. Any ideas? The route _admin_category does exist, and it is working:

$ bin/console debug:router

...

_admin_category                     GET        ANY      ANY    /admin/category/{page} 

...

And my Category entities are being saved to the DB properly.

Upvotes: 0

Views: 792

Answers (1)

Robert
Robert

Reputation: 20286

You should return redirect response try

 return $this->redirectToRoute('_admin_category', ['page' => 1]);

Redirect method creates an object of RedirectResponse class, and it needs to be returned as response. Moreover, you don't have to use redirect + generateUrl you can just use redirectToRoute method which is shortcut for that.

Also I'd suggest wrapping flush with try/catch

For more see docs

Upvotes: 2

Related Questions