3

这是我正在做的事情,我已经使用 FOS 用户包定义了自定义用户类型,也使用了奏鸣曲管理包,我已经成功地为管理员创建了服务config.yml,还在我的自定义包中生成了 fos 用户实体

sonata.admin.hrmanagement:
    class: Namespace\Mybundlename\Admin\MyAdminClass
    tags:
        - { name: sonata.admin, manager_type: orm, group: "Content", label: "My user type" }
    arguments: [null, Namespace\Mybundlename\Entity\FosUser, ~]
    calls:
        - [ setTranslationDomain, [NamespaceMybundlenameBundle]]

我已经在 app 文件夹下的 main congig.yml 中导入了上面的 yml,在创建用户时,我希望我的安全编码器对接收到的纯密码(创建/编辑用户)进行哈希处理,成功地在 main security.yml 中定义了安全编码器,例如

security:
    encoders:
       Namespace\Mybundlename\Entity\FosUser: sha512

现在MyAdminClass我有更新前和更新后的过滤器,我如何访问上面定义的我的实体的安全编码器

public function preUpdate($object)
{
   $salt = md5(time());
   $encoderservice = $this->get('security.encoder_factory');// here is the problem i can't access
   $encoder = $encoderservice->getEncoder($object);
   $encoded_pass = $encoder->encodePassword($object->getPassword(),$salt );             
   $object->setSalt($salt);

}
4

1 回答 1

2

你需要使用

$this->getConfigurationPool()->getContainer()->get('security.encoder_factory')因为容器不能在 Admin 类中直接访问。

编辑

如果您想让对象直接可用于您的代码(如$this->container),那么您可以执行以下操作:

protected $container在您的管理类中添加一个

configure在您的管理类中添加一个方法:

获取容器,并将其分配给$container

public function configure() {
    $this->container = $this->getConfigurationPool()->getContainer();
}

利润!

于 2013-10-02T11:01:11.697 回答