1
votes

Fairly new to Symfony2; I am now using FOSUserBundle as my userprovider. Since it doesn't provide a controller for delete actions, I wrote my own:

    /**
         * Delete user
         *
         * @param integer $id
         *
         * @Route("/delete/{id}")
         *
         * @return RedirectResponse
         */

        public function deleteAction($id)
        {
            $em = $this->getDoctrine()->getManager();
            $um = $this->get('fos_user.user_manager');

            $user = $um->findUserBy(array(
                'id' => $id
                )
            );

            $em->remove($user);
            $em->flush();

           return new RedirectResponse("star9988_user_user_index");
        }

And added a link to the path from my template:

    <a href="{{ path('star9988_user_user_delete', {'id': user.id}) }}">

I had initially tried passing the ObjectManager in, querying for the User object by ID, and then deleting that with the deleteUser method, but for some reason, it wouldn't let me fetch the ObjectManager using the usual constructor injection method.

As a result, I have resorted to calling the EntityManager, and calling its remove() method on my $user object.

The result is very strange: when I check my database with SequelPro, I notice that the specified user object is indeed deleted. However, the browser returns this error:

EntityManager#remove() expects parameter 1 to be an entity object, NULL given.

Any help would be much appreciated.

EDIT:

I have changed my code to the following:

    /**
     * Delete user
     *
     * @param integer $id
     *
     * @Route("/delete/{id}")
     *
     * @return RedirectResponse
     */

    public function deleteAction($id)
    {
        $em = $this->getDoctrine()->getManager();

        /** @var \Star9988\ModelBundle\Entity\User $user */
        $user = $this->getDoctrine()->getRepository('ModelBundle:User')->find($id);

        $em->remove($user);
        $em->flush();

       return new RedirectResponse("star9988_user_user_index");
    }

Strangely, I'm getting the same result: the entity is deleted from the database.

It seems that my route is not passing the parameter for some reason.

DEBUG - SELECT t0.username AS username1, t0.username_canonical AS username_canonical2, t0.email AS email3, t0.email_canonical AS email_canonical4, t0.enabled AS enabled5, t0.salt AS salt6, t0.password AS password7, t0.last_login AS last_login8, t0.locked AS locked9, t0.expired AS expired10, t0.expires_at AS expires_at11, t0.confirmation_token AS confirmation_token12, t0.password_requested_at AS password_requested_at13, t0.roles AS roles14, t0.credentials_expired AS credentials_expired15, t0.credentials_expire_at AS credentials_expire_at16, t0.id AS id17, t0.FirstName AS FirstName18, t0.LastName AS LastName19, t0.creditLimit AS creditLimit20, t0.creditAvailable AS creditAvailable21, t0.accountBalance AS accountBalance22, t0.rebate AS rebate23, t0.parent AS parent24 FROM StarUsers t0 WHERE t0.id = ? LIMIT 1

2

2 Answers

2
votes

Try setting the id as a required parameter, like in this example:

/**
 * @Route("
 *    path          = "/delete/article/{id}", 
 *    name          = "blog_admin_delete_article"
 *    requirements  = { "id" = "\d+" },
 *    methods       = { "GET" }
 * )
 */
public function deleteArticleAction($id) { /* ... */ }

Also you can check in the code that the user was loaded:

    /** @var \Star9988\ModelBundle\Entity\User $user */
    $user = $this->getDoctrine()->getRepository('ModelBundle:User')->find($id);
    if (!$user instanceof User) {
        throw new NotFoundHttpException('User not found for id ' . $id);
    }

I hope it helps.

2
votes

When you got the user manager

$um = $this->container->get('fos_user.user_manager')

You can use the delete after getting the user action like this :

$um->deleteUser($user);

But you need before to check if the user is not null.