gpt4 book ai didi

Symfony2 将任何 HTML Controller 输出为 JSON

转载 作者:行者123 更新时间:2023-12-04 12:22:37 25 4
gpt4 key购买 nike

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

所以如果我连接到

www.domain.com/profile/john-smith

它像现在一样返回 HTML 页面。
但如果我去
www.domain.com/profile/john-smith?app

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

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

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

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

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

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

最佳答案

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

  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 以处理该输出。

要解决这个问题,你可以做两件事。
  • 为您拥有的每个模板创建 json 模板,然后替换 template.html.twig 中的 html与 template.'.$format.'.twig . (注意确保用户不能在 url 中未经验证的情况下传递参数,这将是一个重大的安全风险)。
  • 创建您自己的抽象 Controller 类并覆盖渲染方法以检查请求的格式并基于该格式提供输出。
    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);
    }
    }
    }

  • 注意 上面的代码是一个原型(prototype),不要指望它开箱即用。

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

    关于Symfony2 将任何 HTML Controller 输出为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15428296/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com