繁体   English   中英

什么是在Sonata Admin中覆盖对象删除的最佳方法?

[英]Whats the best way to override object deletion in Sonata Admin?

我已经有一个自定义CRUD控制器。 那么我只需要从Sonata\\AdminBundle\\Controller覆盖Controller::deleteAction()Controller::batchDeleteAction()吗?

或者更好/更好的做法是覆盖Admin类的删除方法?

我希望的行为是我想用存档标志更新记录而不是删除实体。

关于这个主题的文档是不完整的

更新

我的Entity的Repository类中的以下代码按照ModelManagerbatchDelete方法迭代查询对象

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);
        }
    }

我遇到的问题是我的archiveMyEntity()方法所期望的对象是一个Entity对象而不是一个查询对象。

我在管理类中覆盖了删除逻辑,而不是在我的自定义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())
        );
    }

所以我获取所有实体,只需从admin类调用delete方法。

希望这可以帮助。

如果您希望覆盖控制器逻辑或视图,请覆盖您指定的方法。

但是,如果您的目标是在删除之前或之后执行自定义逻辑,则可以覆盖Admin::preRemove($object)Admin::postRemove($object)方法。

您也可以通过重写Admin::delete($object)方法来覆盖整个逻辑。

随意提交PR - 或在相关的Github问题上发表评论 - 以改进文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM