Passing route url format to symfony2 form with get method

我们两清 提交于 2019-12-02 04:39:04
Thomas Potaire

It's the default behavior of HTML forms with GET method. You will need to build that URL yourself.

Backend way

  • Drawback: It makes two requests to the server instead of one
  • Advantage: It's more maintainable because the URL is built using the routing service

Your routing file

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

_search_endpoint:
    pattern: /page
    defaults: { _controller: Bundle:Default:redirect }

Your controller

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);
}

Frontend way

Using Javascript, you can build the URL yourself and redirect the user afterwards.

  • Drawback: You don't have access to the routing service (although you could use the FOSJsRoutingBundle bundle)
  • Advantage: You save one request

Note: You will need to get your own query string getter you can find a Stackoverflow thread here, below I'll use getQueryString on the jQuery object.

(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);
Chase

You could add a second route that will just match /page

then in the controller you can get the defaults. and merge them with any that are passed.

Take a look at a similar question I answered for some code examples.

KendoUI Grid parameters sending to a symfony2 app

I've too encountered this issue and I managed to resolve it with a slightly different solution.

You could also reroute like @Thomas Potaire suggested, but in the same controller, beginning your controller with :

/**
 * @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...
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!