2015-02-10 116 views
1

Symfony2的新增功能;我现在使用FOSUserBundle作为我的用户提供者。因为它不为删除操作提供一个控制器,我写我自己: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"); 
     } 

而且从我的模板添加了一个链接路径:

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

我最初试图传递中的ObjectManager ,通过ID查询User对象,然后使用deleteUser方法删除它,但出于某种原因,它不会让我使用通常的构造函数注入方法来获取ObjectManager。

因此,我采取了调用EntityManager,并在我的$ user对象上调用它的remove()方法。

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

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

+0

FOSUserBundle附带一个用户管理器https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Doctrine/UserManager.php#L49,它可以让你做到这一切:https://github.com/ FriendsOfSymfony/FOSUserBundle/BLOB /主/资源/ DOC/user_manager.md – 2015-02-10 12:23:01

回答

2

尝试在this example设置id作为一个必需的参数,如:

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

我希望它帮助。

2

当你得到了用户管理

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

可以使用,得到了下面的用户操作后删除:

$um->deleteUser($user); 

但你需要前检查,如果用户不为空。