Symfony:在'updateAction'中检索路由参数

时间:2017-05-19 22:49:53

标签: php symfony

我在控制器A中使用以下路线:

@Route("/title/{title}", name="Title")

我有一个名为TitleAction的函数,其中$request$title为参数。此函数返回包含数据的页面。我使用{title}从数据库中检索数据。

在页面上,我有一个过滤器,它调用ajax调用我的控制器中的另一个函数(其中TitleAction也位于其中)。该函数从db中检索一些数据,并向我的ajax调用返回一个json响应。有没有办法检索此函数的{title}参数?

我尝试使用@route$request->get..,但没有结果。

更新:

title.html.twig:

<select id="filter1">
    <option selected disabled>Choose</option>
    {% for c in cs %}
        <option value="{{ c.name }}">{{ c.name }}</option>
    {% endfor %}
</select>
<select id="filter2">
    <option selected disabled>Choose</option>
    {% for g in gs %}
        <option value="{{ g.name }}">{{ g.name }}</option>
    {% endfor %}
</select>

{% if results.low != 0 %}
    <p class="amount" id="low">{{ results.low|round(0, 'floor') }}</p>
{% else %}
    <p class="amount">N/A</p>
{% endif %}

javascript文件中的AJAX调用(我只复制了一个过滤器的一个函数,因为另一个函数是一个副本,但有filter2:

$(document).ready(function () {
    $("#filter1").change(function() {
        var inputCS = $(this).val();
        if(inputCs.length >= 1) {
            var data = {inputCS: inputCS};
            $.ajax({
                type: "POST",
                url: ROOT_URL + "default/update/data",
                data: data,
                dataType: 'json',
                timeout: 3000,
                success: function(results){
                    //some innerHTML replacements
                  if(result.low === null) {
                     document.getElementById("low").innerHTML = 'N/A'
                  }
                  else {
                     document.getElementById("low").innerHTML = 
                     Math.floor(Number(result.result.low));
                  }
                },
                error: function() {
                   //
                }
            })
        }


    });
})

DefaultController:

**
 * @Route("/", name="homepage")
 * @param Request $request
 * @return \Symfony\Component\HttpFoundation\Response
 */
public function indexAction(Request $request)
{
    return $this->render('default/index.html.twig');
}


/**
* @Route("/title/{title}", name="Title")
* @param Request $request
* @param $title
* @return \Symfony\Component\HttpFoundation\Response
*/
public function TitleAction(Request $request, $title)
{



    //Some DB calls to retrieve data with 'where .. = $title'
    return $this->render('default/title.html.twig', array(
            'title' => $title,
            'results' => $results[0],
            'cs' => $cs,
            'gs' => $gs,

            ...
            }
}



/**
 * @param Request $request
 * @return JsonResponse
 */
public function updateDataAction(Request $request)
{


        //Here I also want to use $title so I can use it in my query

        $dataCS = $request->get('inputCS');
        $dataGS = $request->get('inputGS');

        if(!empty($dataGS) and !empty($dataCS)) {
            // $results = Query
        } 
        else {
            // $results = Query

        }

        return new JsonResponse(array('results' => $results[0]));
}

2 个答案:

答案 0 :(得分:1)

default/title.html.twig文件中,您可以像这样引用您的路线:

{{ path('Title',{'title': val.getTitle}) }}

其中title(小写)是传递给路径的参数,然后val是您在数组中设置传递给twig的内容,而getTitle只是一个getter。< / p>

我不确定这是否有助于您的AJAX通话,但在Twig中进行通话可能更容易。您可以在我的文章中阅读更多内容: https://alvinbunk.wordpress.com/2016/08/22/specify-route-with-parameters-in-twig/

希望能帮到你!

答案 1 :(得分:0)

您可以将“title”作为查询参数传递给updateDataAction()方法 首先,在模板中声明一些var someTitle,如下所示:

<script>var someTitle = "{{ $title }}"; </script>

然后,您可以在javascript文件中引用someTitle变量,并将其用作js文件中的查询参数:

$(document).ready(function () {
$("#filter1").change(function() {
    var inputCS = $(this).val();
    if(inputCs.length >= 1) {
        var data = {inputCS: inputCS, title: someTitle};
        $.ajax({
            type: "POST",
            url: ROOT_URL + "default/update/data",
            data: data,
            dataType: 'json',
            timeout: 3000,
            success: function(results){
                //some innerHTML replacements
              if(result.low === null) {
                 document.getElementById("low").innerHTML = 'N/A'
              }
              else {
                 document.getElementById("low").innerHTML = 
                 Math.floor(Number(result.result.low));
              }
            },
            error: function() {
               //
            }
        })
    }


});

})

最后,您可以在updateDataAction()方法中获取标题:

public function updateDataAction(Request $request)
{
    // Here I also want to use $title so I can use it in my query
    $title = $request->query->get('title');
    // ...
}