cod*_*boy 5 symfony sonata-admin
我已经有一个自定义的 CRUD 控制器。那么我只需要覆盖Controller::deleteAction()和Controller::batchDeleteAction()fromSonata\AdminBundle\Controller吗?
或者重写 Admin 类的删除方法是否更可取/更好?
我想要的行为是我想用存档标志更新记录而不是删除实体。
关于这个主题的文档不完整
更新
我实体的 Repository 类中的以下代码batchDelete根据ModelManager
public function batchArchive($class, ProxyQuery $queryProxy)
{
$queryProxy->select('DISTINCT '.$queryProxy->getRootAlias());
try {
$entityManager = $this->getEntityManager();
$batchSize = 20;
$i = 0;
foreach ($queryProxy->getQuery()->iterate() as $pos => $object) {
$this->archiveMyEntity($object); //???
if (($i % $batchSize) == 0) {
$entityManager->flush();
$entityManager->clear();
}
++$i;
}
} catch (\PDOException $e) {
throw new ModelManagerException('', 0, $e);
} catch (DBALException $e) {
throw new ModelManagerException('', 0, $e);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我的 archiveMyEntity() 方法期望的对象是实体对象而不是查询对象。
我在管理类中覆盖了删除逻辑,而不是在我的自定义 CRUD 控制器中,我用以下内容覆盖了 batchActionDelete 逻辑:
public function batchActionDelete(\Sonata\AdminBundle\Datagrid\ProxyQueryInterface $query)
{
if (false === $this->admin->isGranted('DELETE')) {
throw new AccessDeniedException();
}
$res = $query->execute();
if (count($res)) {
foreach ($res as $sqTeamEntity) {
$this->admin->delete($sqTeamEntity, false);
}
$this->admin->flushDoctrine(); //custom method in the admin class
$this->addFlash('sonata_flash_success', 'flash_batch_delete_success');
}
return new RedirectResponse(
$this->admin->generateUrl('list',
$this->admin->getFilterParameters())
);
}
Run Code Online (Sandbox Code Playgroud)
所以我获取所有实体,然后从管理类中调用 delete 方法。
希望这可以帮助。
如果您希望覆盖控制器逻辑或视图,则覆盖您指定的方法是可行的方法。
但是,如果您的目标是在删除之前或之后执行自定义逻辑,您可以重写Admin::preRemove($object)或Admin::postRemove($object)方法。
您也可以通过重写Admin::delete($object)方法来重写整个逻辑。
请随意提交 PR - 或在相关的 Github 问题中发表评论 - 以改进文档。
| 归档时间: |
|
| 查看次数: |
3221 次 |
| 最近记录: |