0

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

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

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

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

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

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

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

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

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

感谢所有欢呼丹尼尔

4

1 回答 1

0

如果我不完全理解您的问题,请原谅我,但如果您已经在控制器中编写了功能并且您想通过 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 调用还是从正常请求调用来不同地处理事情。

于 2017-11-30T03:24:52.190 回答