2017-04-07 2 views
2

Hallo Leute Ich bin neu in Symfony 2 und ich habe wenig verwirrend mit dem Senden von Daten mit AJAX zu PHP-Controller in Symfony 2. Ich möchte ein Projekt mit Google Map erstellen, damit ich MapController erstellen:Senden Sie Ajax Daten an Php-Controller in Symfony2

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

} 

dann erstellen i-Routing:

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] 

so, wenn ich Weg gehen zu:

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

i Anzeige meiner Vorlage map.html.twig

dort habe ich JavaScript-Funktion, wo ich versuchte, Ajax-Daten zu einem gewissen Controller zu senden:

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

Aber ich habe NULL in dieser Antwort: {"data": null}

Antwort

1

Sie müssen sich fragen, was Sie mit diesen von JS gesendeten Daten tun möchten. Wenn es mit der Kartenfunktion zusammenhängt, scheint das Erstellen einer neuen Methode in MapController in Ordnung zu sein. Wenn es nicht mit Karten zu tun hat, könnte das Erstellen eines neuen Controllers ein guter Weg sein.

Die Benennung von Methode und Controller sollte für das, was Sie tun, relevant sein. Ihr saveData Beispiel ist nicht so offensichtlich. Wenn Sie Koordinaten speichern, können Sie diese Methode saveCoordinatesAction benennen und eine dedizierte Route definieren, die nur POST-Anfragen unterstützt.

Um die URL an JS zu übergeben, gehen Sie auf FOSJsRoutingBundle - Sie können bestimmte Routen direkt aus JavaScript generieren.

+0

ich weiß, aber dieser Funktionsname ist nur für den Test jetzt. Also, wenn ich in meinem MapController eine Methode saveCoordinatesAction erstelle, wie soll dann meine var url in Javascript aussehen? Ich habe versucht, "map/saveCoordinatesAction", "Karte/saveCoordinates", "" app_dev.php/map/saveCoordinatesAction "und andere Kombinationen, aber diese Anfrage noch nicht erreicht, nicht zu meinem PHP-Funktion in diesem Controller kommen – johnyT

+0

mam POST http : //localhost/googlemap/web/app_dev.php/saveCoordinatesAction 404 (Nicht gefunden), es ist jetzt ein symphony kilka godzin für das Projekt, und es ist in der Nähe von mnie jescze trochę mylą, wcześniej używałem np Yii2 framework, gdzie w Wenn Ihre Basis-URL "http: // localhost/googlemap/web/app_dev.php /" lautet, dann sollten Sie alle verwenden. Wenn Ihre Basis-URL "http: // localhost/googlemap/web/app_dev.php /" lautet, wird es einfacher für andere Personen, sich unserer Diskussion anzunähern – johnyT

+0

dies (einschließlich 'http: //' Protokollpräfix) in der URL, die dein Javascript aufruft, zB 'http: // localhost/googlemap/web/app_dev.php/saveCoordinates' (' app_dev.php' ist optional, mach es einfach nicht belassen Sie es dort auf Ihrem Produktionsserver), aber Sie müssen eine Route für diese Adresse in 'routing.yml' definieren, genauso wie Sie es für die' map' URL getan haben. – Najki