2015-02-10 3 views
1

Незначительно новое для Symfony2; Теперь я использую FOSUserBundle в качестве моего userprovider. Так как он не обеспечивает контроллер для стирания и действий, я писал мой собственный: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 в , запрос объекта User по идентификатору, а затем удаление этого с помощью метода deleteUser, но по какой-то причине он не позволит мне получить ObjectManager с использованием обычного метода впрыска конструктора.

В результате я прибегал к вызову EntityManager и вызывая метод remove() для моего объекта $ user.

Результат очень странный: когда я проверяю свою базу данных с помощью SequelPro, я замечаю, что указанный пользовательский объект действительно удален. Однако браузер возвращает эту ошибку:

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

Любая помощь будет очень признательна.

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

Как ни странно, я получаю тот же результат: объект удаляется из базы данных.

Похоже, что мой маршрут не пропускает параметр по какой-либо причине.

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/Master/Ресурсы/док/user_manager.md –

ответ

2

Попробуйте установить идентификатор в качестве обязательного параметра, как в 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); 
    } 

Я надеюсь, что это помогает.

2

Когда вы получили менеджер пользователей

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

Вы можете использовать удалить после получения действия пользователя так:

$um->deleteUser($user); 

Но вам нужно, прежде чем проверить, если пользователь не является нулевым.

Смежные вопросы