我有以下实体:
任何用户都可能有多个角色(定义了多对多关系)。任何角色都可能有多个视图(定义了多对多关系)。
作为标准Symfony设置的一部分,用户方法getRoles将角色作为arrayCollection返回,其中role的格式为 ROLE_1 。这部分工作得很好,我从数据库中填充它,然后可以使用内置的RoleVoter使用方法is_granted(' ROLE_1 ')验证它们。
我想要实现的目标是在用户登录时加载用户从角色继承的视图列表,以便它们以与角色相同的方式可用(格式为 VIEW_1 )。这样我就可以编写自己的选民并使用方法is_granted(' VIEW_1 ')验证这些视图。
我知道有可能完成它,因为有自定义选民验证的例子。 SUBSCRIPTION_X属性视图自定义选民和选民部分非常清楚。不幸的是,他们省略了完成实际自定义属性加载的部分。
我认为它是通过方法 loadUserByUsername($ login) 中的UserRepository(实现UserProviderInterface)完成的,但是找不到任何适用于继承自的属性的示例像我打算使用的视图这样的角色。我包含了我使用的当前版本的loadUserByUsername但没有成功获取登录用户可用的视图:
@Order(1000.0)
public class MainBox extends AbstractGroupBox {
@Override
protected TriState getConfiguredScrollable() {
return TriState.FALSE;
}
@Order(1000.0)
public class OfferBox extends AbstractGroupBox {
@Override
protected TriState getConfiguredScrollable() {
return TriState.TRUE;
}
@Override
protected int getConfiguredGridColumnCount() {
return 1;
}
@Override
protected int getConfiguredGridW() {
return 1; // XXX: Added
}
/*
// XXX: Removed
@Override
protected int getConfiguredGridX() {
return 0;
}
@Override
protected int getConfiguredGridY() {
return 0;
}
*/
@Override
protected double getConfiguredGridWeightX() {
return 1; // This should stretch this box
}
@Override
protected void injectFieldsInternal(OrderedCollection<IFormField> fields) {
// Used to inject some dummy fields to enable scrolling
for (int i = 0; i < 30; i++) {
// Add some fields here
}
}
}
@Order(4000.0)
public class ShortCutBox extends AbstractGroupBox {
@Override
protected TriState getConfiguredScrollable() {
return TriState.TRUE;
}
@Override
protected int getConfiguredGridColumnCount() {
return 1;
}
@Override
protected int getConfiguredGridW() {
return 1; // XXX: Added
}
/*
// XXX: Removed
@Override
protected int getConfiguredGridX() {
return 1;
}
@Override
protected int getConfiguredGridY() {
return 0;
}
*/
@Override
protected double getConfiguredGridWeightX() {
return 0; // this defined that box shouldn't stretch
}
@Override
protected int getConfiguredWidthInPixel() {
return 200; // This should give me fix width 200
}
@Order(4100)
public class MyButton1 extends AbstractButton {
@Override
protected String getConfiguredLabel() {
return "Button 1";
}
@Override
protected boolean getConfiguredProcessButton() {
return false; // XXX: Added
}
@Override
protected boolean getConfiguredFillHorizontal() {
return true; // XXX: This is optional
}
}
@Order(4200)
public class MyButton2 extends AbstractButton {
@Override
protected String getConfiguredLabel() {
return "Button 2";
}
@Override
protected boolean getConfiguredProcessButton() {
return false; // XXX: Added
}
@Override
protected boolean getConfiguredFillHorizontal() {
// XXX: This is optional. Enlarge buttons to group box width
return true;
}
}
}
}
我当然可以轻松地在UserRepository抓取视图中添加一些自定义方法,并将其放在用户实体方法getRoles中,以便按照我填充角色的方式填充视图,但这只会是设计污染严重的实体。
所以问题是如何让用户从登录用户对象中可用的角色继承的视图与角色可用的方式相同?