- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Symfony 中有以下实体:
class User implements AdvancedUserInterface, \Serializable {
...
private $roles;
...
public function __construct()
{
...
$this->roles = new ArrayCollection();
// Default role for evey user (new entity);
$this->roles->add("ROLE_USER");
...
}
...
function getRoles() {
return $this->roles->toArray();
}
...
function addRole($role){
$this->roles->add($role);
}
function removeRole($role){
$this->roles->remove($role);
}
...
public function serialize()
{
return serialize(array(
...
$this->roles,
...
));
}
/** @see \Serializable::unserialize() */
public function unserialize($serialized)
{
list (
...
$this->roles,
...
) = unserialize($serialized, ['allowed_classes' => false]);
}
}
当我注册一个用户时,默认角色 (ROLE_USER) 已正确添加。但是当我尝试编辑一个时,数据库记录没有改变:
public function UserAddRole(Request $request){
$userId = $request->request->get("userId");
$role = "ROLE_" . strtoupper($request->request->get("role"));
if($role == "ROLE_USER"){
throw $this->createNotFoundException(
'Cannot remove ROLE_USER role'
);
}
$user = $this->getDoctrine()
->getRepository(User::class)
->findOneBy(array(
'id' => $userId
));
if (!$user) {
throw $this->createNotFoundException(
'User not found'
);
}
$user->addRole($role);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($user);
$entityManager->flush();
return new Response("<pre>".var_dump($user->getRoles())."</pre>");
}
此字段没有任何限制,目前只有硬编码值。
响应中返回的数组包含我想要的角色,但不包含数据库(通过重新加载页面并直接在 MySQL 中进行检查。
有什么想法吗?
谢谢
最佳答案
这里发生了一些不同的事情。根据您上面的评论,您说您正在映射 $roles
到array
类型。这是通过调用 native PHP 函数 serialize(...)
存储在数据库中的。和unserialize(...)
。这意味着如果一个对象具有 ROLE_USER
的角色和ROLE_ADMIN
,数据将如下所示:
a:2:{i:0;s:9:"ROLE_USER";i:1;s:10:"ROLE_ADMIN";}
当 Doctrine 加载你的对象时,它将使用内部 PHP array
输入来存储此数据,这意味着 $this->roles
运行时值为 array('ROLE_USER', 'ROLE_ADMIN')
在这个例子中。
类似的类型是 simple_array
,它在应用程序中的行为相同,但将值作为逗号分隔的列表存储在数据库中。因此,在这种情况下,您的数据库数据将是:
ROLE_USER,ROLE_ADMIN
当前在您的构造函数中,您正在使用 Doctrine ArrayCollection
输入初始化$roles
作为一个集合。但是,如果该字段映射为 array
,从数据库检索对象后,$roles
将是 PHP array
类型,而不是 ArrayCollection
目的。为了说明差异:
// the constructor is called; $roles is an ArrayCollection
$user = new User();
// the constructor is not called; $roles is an array
$user = $entityManager->getRepository(User::class)->findOneById($userId);
一般来说,实际上在我遇到的每种情况下,您只想初始化为 ArrayCollection
对于关联映射,并使用 array
或simple_array
对于标量值,包括 Roles 属性。
您仍然可以实现您想要的addRole(...)
和removeRole(...)
使用一点点 PHP 的行为。例如,使用Doctrine注解映射:
use Doctrine\ORM\Mapping as ORM;
...
/**
* @ORM\Column(name="roles", type="simple_array", nullable=false)
*/
private $roles;
...
/**
* Add the given role to the set if it doesn't already exist.
*
* @param string $role
*/
public function addRole(string $role): void
{
if (!in_array($role, $this->roles)) {
$this->roles[] = $role;
}
}
/**
* Remove the given role from the set.
*
* @param string $role
*/
public function removeRole(string $role): void
{
$this->roles = array_filter($this->roles, function ($value) use ($role) {
return $value != $role;
});
}
(请注意,除非您使用 PHP 7 或更高版本,否则您将无法使用类型提示)
关于交响乐 4 : ArrayCollection add not persisting in database,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51518036/
I have a question about adding files in git. I have found multiple stackoverflow questions about
我是 visual studio 的新手,来自 Delphi。 我有一个充满 .cs 文件的目录树(根是\Common)。 我还有一个充满应用程序的目录树(根目录是\Applications) 最后,
这个问题在这里已经有了答案: Array's lookup time complexity vs. how it is stored (4 个答案) Time complexity for java
谁能告诉我这两者有什么区别: ALTER TABLE x1 ADD INDEX(a); ALTER TABLE x1 ADD INDEX(b); 和 ALTER TABLE x1 ADD INDEX(
为什么有时我们使用 getChildren() add() 而其他时候我们直接使用 add() es: https://docs.oracle.com/javafx/2/get_started/for
如何使用 bootstrap css 在输入下方添加跨度?我需要做这样的事情: 最佳答案 是这样的吗? http://jsfiddle.net/swm53ran/205/ 您可以使用纯 CSS 来实现
问题 np.add(X, 2*Y, out=X) 比 np.add(X, Y, out=X); np.add(X, Y, out=X).使用 np.add(X, Y, out=X); 是一种实际做法吗
当我跑 git add --intent-to-add .所有未跟踪的文件将其状态从“未跟踪的文件”( git status -s 显示 ?? )更改为“未暂存以进行提交的更改”( git statu
我不知道 .add 之间有什么区别和 .sink.add ? 例子: StreamController myStreamController = StreamController(); stream
getContentPane().add() 和 add() 的意思一样吗? public class TestFrame extends JFrame{ public TestFrame()
git add . 和 git add * 会完成完全相同的事情吗? 最佳答案 不,不会。 * 是一个 glob 模式,不会匹配以 开头的文件。 例如,假设这是当前目录,我有 2 个新文件要添加 fo
git的分支与合并的两种方法 git add -A和 git add . git add -u在功能上看似很相近,但还是存在一点差别 git add . :他会
git add [--all | -A] 之间有什么区别?和 git add . ? 最佳答案 此答案仅适用于 Git 版本 1.x。对于 Git 版本 2.x,请参阅其他答案。 总结: git ad
我刚刚安装了最新的 Wix v3.7。我创建了一个 VS 2010“Excel 2010 加载项”项目,并在同一个解决方案中创建了一个 Wix“安装项目”。 问题是,当我尝试从 Wix 项目中引用 A
YUI.add 和 YUI().add 有什么区别? 最佳答案 在第一种情况下,您要注册一个模块可以加载到 YUI 沙箱中,在第二种情况下,您要构建一个沙箱,然后进行注册(这是一种非常不典型的用法)。
测试代码时,任何输入到列表中的值在按下“enter”后都会消失。 我对编程和网络开发非常陌生。请具体一点,以便我理解。 function addItem(){ var item = documen
我正在浏览 python 的 dis 包。我尝试了代码以查看它是如何工作的 >>> def get(): ... x=4 ... y=x+3 ............ this lin
我已经对我的文件夹进行了版本控制 git init git add . git commit -m 'Initial commit' 我应该怎么做 git add 对于我在 .? 中创建的每个新文件
当我执行 $ git add * 时,有时我意识到 git 不会将已删除的文件添加到舞台上,如果删除或添加它,我需要手动指示,但我想不通找出 $ git add --all 有什么区别。因此,如果星号
这个问题在这里已经有了答案: Difference between "git add -A" and "git add ." (12 个答案) 关闭 6 年前。 目前,当我想提交并将内容推送到远程
我是一名优秀的程序员,十分优秀!