7

我已经完成了一个在 Symfony2 中创建的网站,我现在希望该网站的许多功能现在可以在移动应用程序中使用。
我的想法是通过附加一个简单的 URL 变量,然后它将以 JSON 格式输出相关页面请求的所有变量。

所以如果我连接到

www.domain.com/profile/john-smith

它像现在一样返回 HTML 页面。
但如果我去

www.domain.com/profile/john-smith?app

然后它返回一个包含姓名、年龄和其他个人资料信息的 JSON 对象。
然后我的应用程序代码接收 JSON 和进程。

我看不到任何安全问题,因为它只是 JSON 中呈现的变量,没有 HTML。

通过执行上述操作,我可以创建所有应用程序代码并简单地调用与网页相同的 URL,这将返回 JSON 中的变量并省去更多服务器端工作的需要。

问题是:如果不修改每个控制器,我将如何做到这一点?

我无法想象事件监听器会这样做吗?也许我可以拦截 Response 对象并去掉所有的 HTML?

关于执行此操作的最佳实践方法的任何想法?它应该很容易编码,但我正在努力了解它的设计。

4

1 回答 1

5

有一种正确的方法可以为此任务配置路由

  article_show:
  path:     /articles/{culture}/{year}/{title}.{_format}
  defaults: { _controller: AcmeDemoBundle:Article:show, _format: html }
  requirements:
      culture:  en|fr
      _format:  html|rss
      year:     \d+

但是,这仍然需要您使用其他控制结构来编辑每个 Controller 以处理该输出。

要解决这个问题,你可以做两件事。

  1. 为您拥有的每个模板创建 json 模板,然后将 html 替换template.html.twigtemplate.'.$format.'.twig. (注意确保用户不能在 url 中未经验证的情况下传递参数,这将是一个重大的安全风险)。

  2. 创建您自己的抽象控制器类并覆盖渲染方法以检查请求的格式并基于该格式提供输出。

    class MyAbstractController extends Symfony\Bundle\FrameworkBundle\Controller\Controller
    {
        public function render($view, array $parameters = array(), Response $response = null)
        {
            if($this->getRequest()->getRequestFormat() == 'json')
            {
                return new Response(json_encode($parameters));
            }
            else
            {
               parent::render($view, $parameters, $response);
            }
        }
    }
    

注意上面的代码是一个原型,不要期望它开箱即用。

我个人认为第二种方法更正确,因为没有重复代码,安全问题也更少。

于 2013-03-15T15:06:03.290 回答