储蓄挂钩
编辑本页储蓄挂钩
当SonataAdmin提交处理时,会调用一些事件。一个是在任何持久层交互之前,另一个是之后。在编辑和创建操作的提交和验证之间也是如此preValidate
事件调用。事件名称如下:
- 新对象:
preValidate(对象)
/prePersist(对象)
/postPersist(对象)
- 编辑对象:
preValidate(对象)
/preUpdate(对象)
/postUpdate(对象)
- 删除对象:
preRemove(对象)
/postRemove(对象)
值得注意的是,只要Admin成功提交,更新事件就会被调用,而不管是否有任何实际的持久化层事件。这与的用法不同preUpdate
而且postUpdate
在DoctrineORM和其他一些持久性层中的事件。
例如:如果您提交了一个编辑表单,而没有更改表单上的任何值,那么数据库中没有任何东西需要更改,并且DoctrineORM不会触发实体类的preUpdate
而且postUpdate
事件。然而,你的管理类的preUpdate
而且postUpdate
方法是这可以为你所用。
请注意
在将一个管理员嵌入另一个管理员时,例如使用sonata_type_admin
字段类型,子Admin的钩子是不解雇。
与SonataUserBundle一起使用的示例
的SonataUserBundle
为您的Symfony项目提供身份验证功能,并与Doctrine ORM、Doctriob娱乐下载ne ODM兼容。
当用户密码或用户名更新时,用户管理系统需要执行特定的呼叫。方法来解决该问题,这就是Admin包的用法preUpdate
储蓄挂钩:
12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
名称空间奏鸣曲\UserBundle\管理\实体;使用奏鸣曲\AdminBundle\管理\AbstractAdmin;使用奏鸣曲\AdminBundle\形式\类型\ModelType;使用奏鸣曲\UserBundle\形式\类型\SecurityRolesType;使用奏鸣曲\UserBundle\模型\UserManagerInterface;最后类UserAdmin扩展AbstractAdmin{私人UserManagerInterface$userManager;公共函数__construct(UserManagerInterface$userManager){$这->userManager =$userManager;}受保护的函数configureFormFields(FormMapper$形式):无效{$形式->(“一般”)->add (“用户名”)->add (“电子邮件”)->add (“plainPassword”,“文本”)->结束()->(“组织”)->add (“组织”, ModelType::类,“要求”= >假])->结束()->(“管理”)->add (“角色”, SecurityRolesType::类,“多”= >真正的])->add (“锁定”,零, (“要求”= >假])->add (“过期”,零, (“要求”= >假])->add (“启用”,零, (“要求”= >假])->add (“credentialsExpired”,零, (“要求”= >假])->结束();}公共函数preUpdate(对象$用户):无效{$这->userManager->updateCanonicalFields ($用户);$这->userManager->updatePassword ($用户);}}
钩入控制器
您可能已经注意到管理不允许您与删除过程进行交互:您不能取消它。要实现这一点,你应该意识到还有一种方法可以在控制器中钩住动作。
如果定义一个自定义控制器,该控制器继承自CRUDController
,可以重新定义以下方法:
- 新对象:
提前设定(对象)
- 编辑对象:
preEdit(对象)
- 删除对象:
preDelete(对象)
- 显示对象:
preShow(对象)
- 列表对象:
preList(对象)
如果这些方法返回a响应时,进程中断,控制器将按原样返回响应(如果返回null,进程继续)。您可以使用该方法生成到对象显示页面的重定向redirectTo(对象)
.
请注意
如果您需要禁止删除某个特定项目,您可以在preDelete(对象)
方法。