【问题标题】:Send ajax data to php controller in symfony2在 symfony2 中将 ajax 数据发送到 php 控制器
【发布时间】:2017-09-02 16:34:25
【问题描述】:

大家好,我是 symfony 2 的新手,我对使用 ajax 向 symfony 2 中的 php 控制器发送数据感到困惑。我想用谷歌地图创建项目,所以我创建了 MapController:

   <?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
class MapController extends Controller
{ 
    /**
     * @Route("/", name="homepage")
     */
    public function indexAction(Request $request)
    {
        // replace this example code with whatever you need
        return $this->render('map/map.html.twig', [
            'base_dir' => realpath($this->getParameter('kernel.root_dir').'/..').DIRECTORY_SEPARATOR,
            'contData' => ['lat' => '51.24591334500776', 'lng'=> '22.56967306137085']
        ]);
    }


    public function saveAction(Request $request)
    {
        $data = $request->request->get('params');

         return new JsonResponse(['data' => $data], Response::HTTP_OK);
    }

}

然后我创建路由:

    app:
    resource: '@AppBundle/Controller/'
    type: annotation
map:
    path:      /map
    defaults:  { _controller: AppBundle:Map:index }
    requirements:
        page: '\d+' 
map_save:
    path:      /map/save
    defaults:  { _controller: AppBundle:Map:save }
    methods:  [POST] 

所以当我去路线时:

http://localhost/googlemap/web/app_dev.php/map

我显示我的模板 map.html.twig

我有 javascipt 函数,我试图将 ajax 数据发送到某个控制器:

    marker.addListener("click", function () {


                    //!
                    var http = new XMLHttpRequest();
                    var url = "map/save";
                    var params = marker.position.lat();
                    http.open("POST", url, true);

//Send the proper header information along with the request
                    http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

                    http.onreadystatechange = function () {//Call a function when the state changes.
                        if (http.readyState == 4 && http.status == 200) {
                            alert(http.responseText);
                        }
                    }
                    http.send(params);

但我在此响应中有 NULL: {“数据”:null}

【问题讨论】:

    标签: javascript php ajax symfony


    【解决方案1】:

    你需要问问自己你想用 JS 发送的这些数据做什么。如果它与地图功能有关,那么在 MapController 中创建一个新方法似乎很好。如果它与地图无关,那么创建一个新控制器可能是一个好方法。

    方法和控制器的命名应该与您正在做的事情相关。您的 saveData 示例并不那么明显。如果您要保存坐标,则可以将此方法命名为 saveCoordinatesAction 并定义仅支持 POST 请求的专用路由。

    至于将 URL 传递给 JS,请查看 FOSJsRoutingBundle - 它可以让您直接从 JavaScript 生成特定路由。

    【讨论】:

    • 我知道,但这个函数名现在只用于测试。因此,当我在 MapController 中创建方法 saveCoordinatesAction 时,应该如何在 javascript 中查看我的 var url?我尝试使用“map/saveCoordinatesAction”、“map/saveCoordinates”、“”app_dev.php/map/saveCoordinatesAction”和其他组合,但这个请求仍然没有达到,没有来到这个控制器中的我的php函数
    • mam POST localhost/googlemap/web/app_dev.php/saveCoordinatesAction 404(未找到),szczerze jestem nowy w symfony kilka godzin temu postawiłem 项目,żeby się nauczyć i te rutingi mnie jescze trochę mylą,wczegśiniej użdzieł wczeogśiniej używaie2 nie trzeba się martwić o takei sprawy
    • 英语将更容易让其他人加入我们的讨论。如果您的基本 URL 是 http://localhost/googlemap/web/app_dev.php/,那么您应该在 javascript 调用的 URL 中使用所有这些(包括 http:// 协议前缀),例如http://localhost/googlemap/web/app_dev.php/saveCoordinatesapp_dev.php 是可选的,只是不要把它留在你的生产服务器上)但是你需要在routing.yml 文件中为这个地址定义一个路由,就像你为map URL 所做的那样。
    • 您还可以检查您的dev.log 文件,看看这个来自JS 的请求是否命中了您的应用程序。此外,使用php bin/console debug:router CLI 命令检查您的saveCoordinates 路由是否定义正确(意味着它在该命令的输出中列出)。
    • 好的,我使用了 $content = $request->getContent();而不是 $data = $request->request->get('params');谢谢你们的帮助:))祝你有美好的一天:))
    猜你喜欢
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多