0

RBAC システムで使用する UserInterface を実装する User エンティティがあります。システム全体をまだ実装していません。ただし、次のコードを使用してユーザーを削除しようとすると、他のテーブル内のすべてのユーザーとその他の関連オブジェクトが削除され、エラーがスローされます。問題なく他のエンティティからオブジェクトを削除できます。

ユーザー エンティティ

class User implements UserInterface
{
 **
 * @var integer $id
 *
 * @ORM\Column(name="id", type="smallint")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 * 
protected $id;

 **
 * @var string $username
 *
 * @ORM\Column(name="username", type="string", length=20, unique=TRUE)
 * 
protected $username;

 **
 * @var string $password
 *
 * @ORM\Column(name="password", type="string", length=255)
 * 
protected $password;

 **
 * @var string $salt
 *
 * @ORM\Column(name="salt", type="string", length=255)
 * 
protected $salt;

 **
 * @var string $fullName
 *
 * @ORM\Column(name="full_name", type="string", length=60, unique=TRUE)
 * 
protected $fullName;

 **
 * @ORM\ManyToMany(targetEntity="Role", inversedBy="users", cascade={"persist", "remove"})
 * @ORM\JoinTable(name="users_roles")
 * 
 * @var ArrayCollection $userRoles
 * 
protected $userRoles;

public function __construct()
{
    $this->userRoles = new ArrayCollection();
}
}

削除アクション

public function deleteUserAction($id) {
$user = $em->getRepository('ACMECompanyBundle:User')->find($id);
$currentUser = $this->get('security.context')->getToken()->getUser();
if ($id == $currentUser->getId()) {
    return new Response("You cannot delete the current user");
}        
if (!$user) {
    throw $this->createNotFoundException('No user found for id '.$id);
}
try {
    $em->remove($user);
    $em->flush();
    $msg = "User deleted!";
    $code = "OK";
} catch (DBALException $e) {
    return new Response($e);
    $msg = "User cannot be deleted!";
    $code = "ERR";
}
$response = new Response(json_encode(array('code' => $code, 'msg' => $msg)));
$response->headers->set('Content-Type', 'application/json');
return $response;
}

すべてのユーザーが削除された後に返されるエラーは

InvalidArgumentException: 識別子を含まない EntityUserProvider からユーザーを更新することはできません。ユーザー オブジェクトは、Doctrine によってマップされた独自の識別子でシリアル化する必要があります。

4

2 に答える 2

0

doctrineがユーザーを削除すると、このユーザーに割り当てられているすべてのロールと、これらの役割に割り当てられているすべてのユーザーも削除されます。したがって、アノテーションスキーマによると、これは正しい動作です。これは、$userRolesアノテーションのcascade= {"remove"}と、Roleエンティティの$usersアノテーションのcascade={"remove"}によるものです。

カスケードの削除を防ぎ、カスケードを永続的に維持したい場合は、ユーザーとロールの両方の関係から「削除」引数を削除してください

于 2012-10-25T07:57:13.230 に答える