Symfony1 用Symfony替换后端中生成的删除方法

Symfony1 用Symfony替换后端中生成的删除方法,symfony1,generator,custom-action,backend,Symfony1,Generator,Custom Action,Backend,我在Symfony的后端应用程序中有很多模型。由于这些模型通过外键相互关联,我想用我自己的方法替换默认的delete方法,以检查是否可以删除对象 为此,我开发了一个中间类MyActions,它继承自sfActions,并在generator.yml中使用MyActions设置actions\u base\u class 在MyActions类中,我放置了一个executeeleteifnotused方法,我希望执行该方法而不是executeelete 在配置模块操作时,我在generator.y

我在Symfony的后端应用程序中有很多模型。由于这些模型通过外键相互关联,我想用我自己的方法替换默认的delete方法,以检查是否可以删除对象

为此,我开发了一个中间类MyActions,它继承自sfActions,并在generator.yml中使用
MyActions
设置
actions\u base\u class

MyActions
类中,我放置了一个
executeeleteifnotused
方法,我希望执行该方法而不是
executeelete

在配置模块操作时,我在
generator.yml
中做了如下操作:

list:
    title: Authorities
    display: [name, updated_at]
    fields:
      name:
        label: Name
      updated_at:
        label: Last update
        date_format: f
    sort: ~
    object_actions:
      _edit:    ~
      _delete: { label: Delete, action: delete_if_not_used }
但是Symfony仍然生成到
executeElete
的路由,而不是我定义的路由

我做错了什么?实现这一点的最佳方式是什么?除了sfDoctrineRouteCollection之外,我还必须添加自定义路由吗


谢谢

在我看来,你把事情弄得比需要的更复杂了。我会坚持使用常规操作类,并使用您自己的自定义方法覆盖delete方法。这样您就知道您的代码正在被使用,而不必乱动generator.yml

编辑

根据你的评论,我明白你为什么要按照问题中解释的方式来做。在generator.yml中更改
\u delete
的操作将不起作用。我不太清楚为什么,但我相当肯定这与它是一个Javascript请求这一事实有关。而是添加一个新的自定义操作

list:
  object_actions:
    _edit: ~ # This ensures your edit action remains unchanged
    delete_if_not_used: { label: Delete, action: action: delete_if_not_used }

请注意,generator.yml中的实际操作方法和操作名称必须匹配。在最初的问题中,您使用的是generator.yml中的方法
executeDeleteIfNotUsed
,如果未使用,则使用
delete。这是行不通的,因为就Symfony所知,这是两种完全不同的方法。我建议只在generator中使用
deleteifnotused
。在我看来,yml

似乎使这比需要的更复杂。我会坚持使用常规操作类,并使用您自己的自定义方法覆盖delete方法。这样您就知道您的代码正在被使用,而不必乱动generator.yml

编辑

根据你的评论,我明白你为什么要按照问题中解释的方式来做。在generator.yml中更改
\u delete
的操作将不起作用。我不太清楚为什么,但我相当肯定这与它是一个Javascript请求这一事实有关。而是添加一个新的自定义操作

list:
  object_actions:
    _edit: ~ # This ensures your edit action remains unchanged
    delete_if_not_used: { label: Delete, action: action: delete_if_not_used }

请注意,generator.yml中的实际操作方法和操作名称必须匹配。在最初的问题中,您使用的是generator.yml中的方法
executeDeleteIfNotUsed
,如果未使用,则使用
delete。这是行不通的,因为就Symfony所知,这是两种完全不同的方法。我建议只在generator.yml中使用
deleteifnotused
我认为您的操作方式不对。您刚刚将删除逻辑放入了模型的delete()方法中。这是最好的实践和推荐的方法

对于生成的管理操作,您甚至没有什么可更改的,因为它使用对象的delete()方法:

if ($this->getRoute()->getObject()->delete())
{
  $this->getUser()->setFlash('notice', 'The item was deleted successfully.');
}

此外,将此逻辑放入模型将允许您以更一致的方式删除实体。

我认为您的方式不正确。您刚刚将删除逻辑放入了模型的delete()方法中。这是最好的实践和推荐的方法

对于生成的管理操作,您甚至没有什么可更改的,因为它使用对象的delete()方法:

if ($this->getRoute()->getObject()->delete())
{
  $this->getUser()->setFlash('notice', 'The item was deleted successfully.');
}

此外,将此逻辑放入模型将允许您以更一致的方式删除实体。

我想捕获异常
Model->delete()
引发并将用户重定向到另一个页面。这就是为什么我在控制器操作中,而不是在模型方法中实现它。我已经在前端实现了这一点,它没有给我带来任何问题。我需要中间类,因为它应该在几个模块中创建。我想捕获异常
Model->delete()
引发并将用户重定向到另一个页面。这就是为什么我在控制器操作中,而不是在模型方法中实现它。我已经在前端实现了这一点,它没有给我带来任何问题。我需要中间类,因为它应该在几个模块中生成正如我告诉@Arms的,我需要中间类,因为它应该在几个模块中生成。我不想在几个类中复制相同的逻辑。也许解决方案是添加一个中间模型classOk,在这种情况下,你也可以编写你自己的管理生成器,这样你就可以按照你想要的方式编写删除操作(还有更多!)。@Damien,虽然我认为使用自定义管理生成器是一件好事,但对于elitalon试图完成的事情来说,这完全是过火了。编写一个新的生成器需要很多时间:)@Arms,没有那么多,他只需将整个生成器文件夹复制/粘贴到自己的插件中,并自定义删除操作生成器模板。我不知道是否有文件记录,但效果很好。我也使用这种技术在生成的管理员上添加了一个show操作。正如我告诉@Arms的,我需要中间类,因为它应该在几个模块中创建。我不想在几个类中复制相同的逻辑。也许解决方案是添加一个中间模型classOk,在这种情况下,你也可以编写你自己的管理生成器,这样你就可以按照你想要的方式编写删除操作(还有更多!)。@Damien,虽然我认为使用自定义管理生成器是一件好事,但对于elitalon试图完成的事情来说,这完全是过火了。编写一个新的生成器需要很多时间:)@Arms,没有那么多,他只需要复制/粘贴整个生成器文件夹