【问题标题】:Passing route url format to symfony2 form with get method使用 get 方法将路由 url 格式传递给 symfony2 表单
【发布时间】:2014-04-20 05:48:21
【问题描述】:

不确定我是否正确地写了主题,但无论如何。

因为您可以创建具有不同参数的特定路线,例如:

_search:
    pattern: /page/{category}/{keyword}
    defaults: { _controller: Bundle:Default:page, category: 9, keyword: null }

有没有什么方法可以从带有 GET 方法的表单获取到特定路由的 url 格式?

目前的网址类似于 /page?category=2?keyword=some+keyword

因此不会像您注意到的那样传递到路由格式。

我需要做什么才能使其通过这种特定格式工作?我真的不知道如何重写页面 url 以匹配特定 url 的路由设置。即使在普通的php中也偶然发现了这个......

提前致谢。

【问题讨论】:

    标签: php forms symfony get


    【解决方案1】:

    这是带有 GET 方法的 HTML 表单的默认行为。您需要自己构建该 URL。

    后端方式

    • 缺点:它向服务器发出两个请求,而不是一个
    • 优点:更易于维护,因为 URL 是使用路由服务构建的

    您的路由文件

    _search:
        pattern: /page/{category}/{keyword}
        defaults: { _controller: Bundle:Default:page, category: 9, keyword: null }
    
    _search_endpoint:
        pattern: /page
        defaults: { _controller: Bundle:Default:redirect }
    

    你的控制器

    public function redirectAction()
    {
        $category = $this->get('request')->query->get('category');
        $keyword = $this->get('request')->query->get('keyword');
    
        // You probably want to add some extra check here and there
        // do avoid any kind of side effects or bugs.
    
        $url = $this->generateUrl('_search', array(
            'category' => $category,
            'keyword'  => $keyword,
        ));
    
        return $this->redirect($url);
    }
    

    前端方式

    使用 Javascript,您可以自己构建 URL,然后重定向用户。

    注意:您需要获取自己的查询字符串 getter,您可以在下面找到 Stackoverflow thread here,我将在 jQuery 对象上使用 getQueryString

    (function (window, $) {
        $('#theFormId').submit(function (event) {
            var category, keyword;
    
            event.preventDefault();
    
            // You will want to put some tests here to make
            // sure the code behaves the way you are expecting
    
            category = $.getQueryString('category');
            keyword = $.getQueryString('keyword');
    
            window.location.href = '/page/' + category + '/' + keyword;
        }):
    })(window, jQuery);
    

    【讨论】:

    • 好的,谢谢。在我看到解决方案之前,我已经使用 JS 制作了前端方式。似乎除了自己制作网址或重定向它之外,真的没有“标准”方式。再次感谢您,答案也很好!
    【解决方案2】:

    您可以添加第二条仅匹配 /page 的路由

    然后在控制器中您可以获得默认值。并将它们与传递的任何内容合并。

    看看我为一些代码示例回答的类似问题。

    KendoUI Grid parameters sending to a symfony2 app

    【讨论】:

    • 我不相信这会有所帮助,抱歉。在这种情况下,我想要的是当您单击表单中的提交时,将 url: /page?category=2?keyword=some+keyword 更改为 /page/{category}/{keyword} 页面是操作文件从表格中,你知道。可能是错的,我认为这与重写而不是 symfony 有关:-/
    【解决方案3】:

    我也遇到过这个问题,我设法用稍微不同的解决方案解决了这个问题。

    您也可以像@Thomas Potaire 建议的那样重新路由,但在同一个控制器中,以:

    /**
     * @Route("/myroute/{myVar}", name="my_route")
     */
    public function myAction(Request $request, $myVar = null)
    {
        if ($request->query->get('myVar') !== null) {
            return $this->redirectToRoute('my_route', array(
                'myVar' => str_replace(' ','+',$request->query->get('myVar')) // I needed this modification here
            ));
        }
        // your code...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-09
      • 2017-05-12
      • 2016-07-06
      相关资源
      最近更新 更多