REST API /单页面应用程序的Symfony路由

时间:2014-09-18 00:33:11

标签: php rest symfony routing fosrestbundle

我正在尝试为我的Symfony2单页应用程序设置路由,但我不确定如何正确处理它而不会感觉超级hacky。

以下是我需要它做的以及我是如何尝试设置的:

经过身份验证

  • 任何请求application/json的路线都应该照常设置路线。

  • 任何未请求application/json的路由都应该加载一个控制器,该控制器呈现包含我的单页应用程序的所有JS的twig文件。

  • 任何不存在且结束寻找symfony路由的静态资源,例如[.js,.css,.jpeg等]应该返回404。

未经过身份验证时

  • 请求application/json的任何内容都应返回403

  • 任何不请求application/json的内容都应返回登录页面

这是我到目前为止所尝试的内容:

  • 使用每个服务的FOSRestBundle设置路由

  • 如果请求不是application/json,则设置一个返回基本控制器html的侦听器

    if (!in_array('application/json', $request->getAcceptableContentTypes())) {
        $fakeRequest = $event->getRequest()->duplicate(
            null,
            null,
            array('_controller' => 'HvHDashboardBundle:Dashboard:index')
        );
        $controller = $this->resolver->getController($fakeRequest);
        $event->setController($controller);
    }
    
  • 如果静态资源不存在,设置一堆'catch all'路由伪造404。

    # routing.yml
    # Catch any files that are meant to be their own static resource and return 404  
    catch_all_fail:
        pattern:  /{uri}.{_format}
        defaults: { _controller: MyBundle:Dashboard:return404 }
        requirements:
            _format: js|hbs|css|jpg|gif|jpeg|png
    

问题

  • 这种方法感觉像是一次大规模黑客攻击,而不是Symfony路由系统的工作方式
  • 即使未经过身份验证,也会返回基本控制器页面,因为类型侦听器在安全上下文之前被命中并强制该控制器呈现。

问题:

其他如何使用Symfony解决路由和单页应用程序的问题,他们最初需要使用twig呈现HTML,然后JS接管并请求JSON?

1 个答案:

答案 0 :(得分:1)

只制作API,根本不制作静态页面。相信我,我最近使用Symfony做了一个中等大小的API,这是最佳选择。如果您不将API与静态页面混合,它将大大简化您的后端安全性。当然,如果你想拥有某种登陆页面,你仍然可以拥有静态页面。但尽量不要将它们与主应用程序混合使用。

即使是登录,也不要制作静态页面,而是使用api路由来验证用户名/密码,并为用户返回auth令牌作为响应。例如,一个用户可以拥有多个令牌(可以在多个位置登录),并且每次都会在请求标头中发送令牌。

如果令牌已经过验证,那么symfony会知道它属于哪个用户,因此您将会知道“用户”#。如果没有令牌,它应该返回"未经过身份验证",如果令牌无效也会出现类似或“错误请求”。

使用API​​时我必须做的一件事是我必须编写一个请求侦听器来接受JSON内容并将其转换为请求对象,因此我可以使用$ request-> request来访问数据。

如果您有任何疑问,请在评论中告诉我,我可以提供帮助。

就路由而言,遵循REST规则,您将会很高兴。