【问题标题】:how to create save actions in api-platform如何在 api-platform 中创建保存操作
【发布时间】:2017-11-29 16:42:06
【问题描述】:

我正在尝试在我的 symfony 项目中实现一些 api。目前该项目有许多带有标准 crud 的控制器,基于 html 表、表单/验证器等。

我正在寻找 api-platform 项目,该项目可以使标准 rest api 的构建变得非常容易,并且对于 GET 部分,它符合我的需要。 但是对于 POST/PUT/DELETE 部分,它在实体上缝合了一个非常基本的持久化操作,突然在我的项目中,我需要在实体持久化之后执行更多操作。

我已经把文档变红了,我真的很困惑如何做到这一点...... 我看到了两种可能性:

  • 使用事件系统,为每个实体订阅 POST_WRITE

  • 为实体的每个创建/更新/删除操作创建自定义操作

在这两种情况下,我都会在项目中拥有大量的单个操作或事件订阅者 (30/40),而且维护起来真的很不舒服。此外,我可能必须复制控制器中已有的相同代码,以维护旧的表单系统,直到全部以 API 格式重写。

关于如何解决这个问题的任何建议?

没有办法使用相同的控制器操作,例如在 FOSRestBundle 中,这样我就可以接收数据,执行各种验证/持久化/额外操作,然后返回由 api 管理的结果-平台活动?

有什么方法可以手动调用 api 平台的某些部分,如反序列化/序列化、标准控制器操作中的过滤器和分页?

谢谢大家 干杯 丹尼尔

【问题讨论】:

    标签: symfony api-platform.com


    【解决方案1】:

    如果我不完全理解您的问题,请原谅我,但如果您已经在控制器中编写了功能并且您想通过 api 访问相同的操作,那么也许您可以在每个操作上设置多个路由,具体取决于动作被调用,你可以做出不同的反应。例如:

    /**
     * @Route("/api/v1/tester", name="api_tester")
     * @Route("/tester", name="tester")
     */
    public function testerAction( Request $request )
    {
        $route = $request->attributes->get('_route');
    
        if( $route == "api_tester" )
            #..do things the api way
            response = array( "success" => 1, "data" => $return_string );
            return new Response( json_encode( $response ) );
        } else { //non-api
            $this->render('tester/basic.html.twig', array();
        }
    }
    

    您可以评估使用了哪个路由,并且在您的操作的各个部分中,您可以根据操作是通过 api 调用还是从正常请求调用来不同地处理事情。

    【讨论】:

    • 感谢您的回答 :) 我已经尝试过,并且可以使用 FOSRestBundle 轻松完成。它管理多路由和序列化,但不像过滤/查询构建。寻找可以执行这些类型操作的东西,我发现了 api-platform,它可以做很多有趣的事情,但是它可以与基于操作和事件 (adr) 的不同操作而不是 mvc 逻辑的普通控制器一起工作。我试图了解如何结合这两个世界:)
    猜你喜欢
    • 2021-04-09
    • 2023-02-02
    • 1970-01-01
    • 2012-06-10
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    相关资源
    最近更新 更多