使用get方法将路由url格式传递给symfony2表单

时间:2014-03-14 18:52:57

标签: php forms symfony get

不确定我是否正确地写了这个主题。

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

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

从使用GET方法的表单到达该路由特定的url格式是否有任何方法?

目前网址是/ page?category = 2?keyword = some + keyword

因为您没有注意到路线格式。

要让它通过这种特定格式,我需要做什么?我真的不知道如何重写页面网址以匹配特定网址的路由设置。即便在普通的PHP中也偶然发现了......

提前致谢。

3 个答案:

答案 0 :(得分:5)

它是使用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);

答案 1 :(得分:0)

您可以添加仅匹配/ page

的第二条路线

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

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

KendoUI Grid parameters sending to a symfony2 app

答案 2 :(得分:0)

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

您也可以像@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...
}