无法在symfony控制器中访问javascipt变量

时间:2019-05-31 16:17:18

标签: javascript php jquery ajax symfony

在我的symfony(v3.4)项目中,我需要将一些javascript变量从视图传递到包含表单的控制器:我使用Jquery和Ajax将变量发送到正确的路径,但是由于某些原因,我无法访问它来自我的控制器。

这是我的树枝视图中的脚本部分:

 $(".month").click(function() {


            var click = $(this);

            var month = click.val();
            var year = $("#years").val();

            var url = "{{ path('av_platform_saisie') }}";

            $.ajax(url,
                {
                    type: 'POST',
                    data: { 'month': month, 
                            'year': year
                          },
                    success: function (data) {

                        alert('OK');
                    },
                    error : function(jqXHR, textStatus, errorThrown){}
                });

        });

还有我的控制器:

public function saisieAction(Request $request)
    {

        $user = $this->getUser();
        $thisyear = date("Y");

        $em = $this->getDoctrine()->getManager();

        // Create the form
        $form = $this->get('form.factory')->createBuilder(FormType::class)
            ->add('ndf', CollectionType::class, array(
                'entry_type' => NoteDeFraisType::class,
                'label' => false,
                'allow_add' => true,
                'allow_delete' => true,
            ))
            ->getForm();


        // if the form has been submited
        if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {

            if($request->isXMLHttpRequest()){

                $month = $request->get('month');
                $year = $request->get('year');
                $sub_date = $month .'/' .$year;

            }

            $notesDeFrais = $form['ndf']->getData();


            foreach ($notesDeFrais as $ndf) {
                $ndf->setUser($user);
                $ndf->setMonth($sub_date);
                $em->persist($ndf);
            }

            $em->flush();


        }


        return $this->render('AvPlatformBundle:Platform:saisie.html.twig',
            array(
                'year' => $thisyear,  'form' => $form->createView()
            ));
    }


奇怪的是:我试图从一个新的Twig视图发送我的js变量,该视图不是由我的控制器渲染的,并且在完全相同的代码下也能正常工作,所以也许这是正常现象吗?

编辑: 我进行了一些调试,实际上if($request->isXMLHttpRequest())中的代码未执行

4 个答案:

答案 0 :(得分:3)

您没有使用正确的语法来获取参数,这应该是这样:

if($request->isXMLHttpRequest()) {
    $month=$request->request->get('month');
    $year=$request->request->get('year');
    $sub_date=$month .'/' .$year;
}

如果您想获得GET参数,就是这样:

$request->query->get('get_param');

答案 1 :(得分:0)

您必须正确获取请求的内容。

根据您的Symfony版本,其他答案可能不起作用,您可能必须使用:

$ request-> getContent();

有权访问包含您的数据的关联数组。

(编辑以添加我的评论):如果它不起作用,那么,我脑中唯一的另一件事就是您的IDE自动导入将在控制器中导入错误的“ Request”类?确保使用->使用Symfony \ Component \ HttpFoundation \ Request;

答案 2 :(得分:0)

将您的网址放在传递给ajax的数组中,如下所示:

<html>
  <head>
    <script
      crossorigin
      src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.1/react.js"
    ></script>
    <script
      crossorigin
      src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.1/react-dom.js"
    ></script>
    <script src="https://unpkg.com/babel-standalone@6.26.0/babel.min.js"></script>
  </head>
  <body>
    <div id="app"></div>
    <script type="text/babel">
      class Foo extends React.Component {
        state = {
          loading: false
        };
        componentDidMount() {
          console.log("mounted");
        }
        leave() {
          this.setState({
            loading: true
          });
          setTimeout(() => {
            this.setupReset();
            window.location.href = "https://github.com";
          }, 2000);
        }

        setupReset() {
          let interval = setInterval(() => {
            if (
              !!window.performance &&
              window.performance.navigation.type === 2
            ) {
              clearInterval(interval);
              console.log('reseting');
              this.setState({ loading: false });
            }
          },500);
        }

        render() {
          return this.state.loading ? (
            <div>loading...</div>
          ) : (
            <button onClick={this.leave.bind(this)}>leave</button>
          );
        }
      }
      ReactDOM.render(<Foo />, document.getElementById("app"));
    </script>
  </body>
</html>

答案 3 :(得分:-1)

您是否检查了表单的源代码,action属性的值是什么?我认为您不能像您那样为该AJAX请求添加js url。理想情况下,安装FosJsRoutingBundle,然后修改为:

url: Routing.generate('av_platform_saisie')