Symfony 右键窗体事件以显示修改的数据并更新修改的数据?

Symfony 右键窗体事件以显示修改的数据并更新修改的数据?,symfony,symfony-forms,Symfony,Symfony Forms,一个简单的任务:在显示表单之前,如果$data->getRole()以“ROLE\uu”开头,请删除此字符串并仅显示其余字符串。当用户提交表单时,执行相反的操作:在名称前添加“ROLE” 做这件事最好的地方是哪里?实际上我使用的是PRE\u SET\u DATA和POST\u BIND这些是执行此操作的正确事件吗? $builder->addEventListener(FormEvents::PRE_SET_DATA, function(DataEvent $eve

一个简单的任务:在显示表单之前,如果
$data->getRole()
“ROLE\uu”
开头,请删除此字符串并仅显示其余字符串。当用户提交表单时,执行相反的操作:在名称前添加
“ROLE”

做这件事最好的地方是哪里?实际上我使用的是
PRE\u SET\u DATA
POST\u BIND
这些是执行此操作的正确事件吗?

    $builder->addEventListener(FormEvents::PRE_SET_DATA,
        function(DataEvent $event){

        if(is_null($data = $event->getData()) || !$data->getId()) return;

        $data->setRole(strtoupper(preg_replace('/^ROLE_/i', '',
            $data->getRole())));

    });

    $builder->addEventListener(FormEvents::POST_BIND,
        function(DataEvent $event) {

        if(is_null($data = $event->getData()) || !$data->getId()) return;

        $data->setRole('ROLE_' . strtoupper($data->getRole()));

    });

我不会使用事件来阅读没有前缀“role”的角色。由于事件阻碍了您的工作流程,因此应谨慎使用事件!和symfony一起工作了一段时间,我在没有其他方法的情况下使用了一两次。其他时候都有更好的办法

我倾向于简单地添加函数getShortRole和setShortRole,并在实体中使用shortRole:

class MyEntity {
    private $role;

    public function setShortRole($role) {
        $this->role = 'ROLE_' . strtoupper($role);
    }

    public function getShortRole() {
        return strtoupper(preg_replace('/^ROLE_/i', '', $this->role));
    }
}
使用模型而不是事件可以省去很多麻烦

第二种更复杂的方法是使用一个表示表单而不是实体的模型,并将表单映射到实体。这里有一篇关于这个的好文章! 我自己用,效果很好