我是symfony的新手 . 我希望能够将管理员角色名称配置到我的应用程序中 . 我需要做一些事情:(在控制器中)
if($this->getUser()->isAdmin()) {
//..
}
在用户实体中,我可以将 isAdmin
定义为:
function isAdmin()
{
$this->hasRole('ROLE_ADMIN');
}
但是那样,ROLE_ADMIN可以't be configured. Note that I don'想要将'a role name'作为param(或默认参数)传递给 isAdmin
函数 . 我希望它像我可以将对象传递给用户实体:
public function __construct(AuthConfiguration $config)
{
$this->config = $config;
}
public function isAdmin()
{
return $this->hasRole($this->config->getAdminRoleName());
}
但是,如何将对象传递给用户实体,因为用户创建是由存储库处理的?
2 回答
只有在使用关键字
new
创建对象的新实例时,才会调用构造函数 . 即使它是hydrates实体,Doctrine也不会调用构造函数 .您可以创建own entity hydrator并调用实体's constructor however I haven'尝试此解决方案 . 它可能不那么可维护 .
我想提供一个我更喜欢的替代方案(你可能不会) .
在我的所有项目中,架构如下:
Controller <-> Service <-> Repository <-> Entity
.这种架构的优点是使用dependency injection with services .
在您的services.yml中
在您的服务中:
在你的控制器中:
它远离您正在寻找的解决方案,但在我看来,它似乎更符合Symfony2提供的内容 .
另一个优点是您可以扩展管理员的定义 . 例如,在我的项目中,我的用户服务有一个具有额外逻辑的isAdmin() method .
您可以使用此捆绑包为角色设置自定义Doctrine DBAL ENUM类型:https://github.com/fre5h/DoctrineEnumBundle
在config.yml中注册新类型:
将用户的角色字段配置为ENUM RoleType类型:
并在您的实体或存储库或其他任何地方使用它: