Symfony2:FOSUserBundle 删除操作错误

Symfony2: FOSUserBundle Delete Action Error

对 Symfony2 相当陌生;我现在使用 FOSUserBundle 作为我的用户提供者。由于它不提供用于删除操作的控制器,因此我编写了自己的控制器:

    /**
         * 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");
        }

并在我的模板路径中添加了 link:

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

我最初尝试传入 ObjectManager,通过 ID 查询 User 对象,然后使用 deleteUser 方法删除它,但由于某种原因,它不允许我使用通常的构造函数注入获取 ObjectManager方法。

因此,我求助于调用 EntityManager,并在我的 $user 对象上调用它的 remove() 方法。

结果很奇怪:当我用SequelPro检查我的数据库时,我注意到指定的用户对象确实被删除了。但是,浏览器returns这个错误:

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

如有任何帮助,我们将不胜感激。

编辑:

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");
    }

奇怪的是,我得到了相同的结果:该实体已从数据库中删除。

我的路由好像因为某些原因没有传递参数。

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

尝试将 id 设置为必需参数,如 this example:

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

您还可以查看用户加载的代码:

    /** @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);
    }

希望对您有所帮助。

当你得到用户管理器时

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

您可以在获得用户操作后使用删除,如下所示:

$um->deleteUser($user);

但您需要先检查用户是否不为空。