2016-07-21 4 views
0

Ich werde versuchen, die Frage ein wenig mehr zu vereinfachen. In index.blade.php habe ich diesen AJAX-Anruf, der an meinen Controller weitergeleitet wird. Ich habe dem Select-Element einen "Namen" hinzugefügt, so dass die Formularserialisierung einfacher ist und ich das Formular weggelassen habe. Es POSTEN mit Parametern:Erstellen einer jQuery AJAX-Anfrage von Laravel View

command 
_token 
value1 
value2 

$("#apiselection").submit(function(event) { 
alert("Handler for .submit() called."); 
event.preventDefault(); 
var formParams = $("#apiselection").serialize(); 
var data = formParams; 
    $.post("dicomgrid", data, function(result){ 
     alert(result); 
     $("#APIresults").html(result); 
    }); 
}); 

In routes.php Ich habe dies:

Route::post('dicomgrid', '[email protected]'); 

, die von dem Contoller behandelt wird, die jetzt dies ist. Ich musste Illuminate \ Http \ Request hinzufügen, damit es funktioniert.

<?php 
namespace App\Http\Controllers; 
use Illuminate\Http\Request; 

class DicomGridController extends AppBaseController 
{ 

    /** 
    * Display a listing of the resource. 
    * 
    * @return Response 
    */ 
    public function apiCall(Request $request) { 
     if ($request->input('command') == "Login") { 
      return "test2"; 
     } 
     else { 
      return "test"; 
     } 
    } 
} 

Dieser Teil funktioniert.

Allerdings möchte ich im Wesentlichen einen AJAX-Aufruf (nicht sicher, dass Sie das innerhalb einer Controller-Klasse mithilfe von jQuery oder einer anderen Methode tun können, so dass ich zurück zum ursprünglichen Aufruf bin, was ich zurück Englisch: www.mjfriendship.de/en/index.php?op...39&Itemid=32 Es muss einen besseren Weg geben, das zu tun, aber ich mag die Idee, einen Controller zu haben, der alle Anfragen für diese spezielle Anwendung bedient. Ich fange gerade erst damit an, also ist es meistens ein . Lernübung

Um dies näher auszuführen, die PHP-Seite, die einige meiner Funktionen wie diese, abgespeckte Version:

<?php 
$option = $_POST["APICall"]; 
ini_set('display_errors', 1); 
ini_set('display_startup_errors', 1); 
error_reporting(E_ALL); 
$curl = curl_init(); 
curl_setopt($curl, CURLOPT_VERBOSE, TRUE); 
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
$APIBase = 'xxx'; 
$userName = "xxx"; 
$passWord = "xxx"; 
$sid =null; 
$studyUUID; 

function CallAPI($method, $API_command, $data = false) 
{ 
    global $curl; // curl object 
    global $APIBase; // base url for API calls 
    global $sid; // session id, null initially, but after login it is set for the session, 
    switch ($method) 
    { 
     case "POST": 
      curl_setopt($curl, CURLOPT_POST, 1); 

      if ($data) 
       curl_setopt($curl, CURLOPT_POSTFIELDS, $data); 
      break; 
     case "PUT": 
      curl_setopt($curl, CURLOPT_PUT, 1); 
      break; 
     default: 
      if ($data) 
       $url = sprintf("%s?%s", $url, http_build_query($data)); 
    } 

    curl_setopt($curl, CURLOPT_URL, $APIBase . $API_command); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 

    if ($sid == null) { 
     curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
     curl_setopt($curl, CURLOPT_USERPWD, "login:password"); 
    } 

    $result = curl_exec($curl); 
    return $result; 
} 

Es gibt andere Funktionen auf derselben Seite, die von der initialisierten Variablen und $ curl abhängen. Fazit ist, dass ich einige Ergebnisse, entweder im JSON-Format oder in einem anderen Text (wie formatiertes Array print_f), hauptsächlich zur Entwicklung und zum Testen, abrufe. Deshalb möchte ich, dass ein Controller diesen Feature-Satz behandelt.

Also meine Frage ist, wie rufe ich meine Funktionen auf dieser Seite im Controller und die Ergebnisse zurück zu meinem ursprünglichen AJAX-Anruf.

Es ist eine dumme Frage oder Methode?

Vielleicht ist das, was ich brauche?

Calling a function within a Class method?

Antwort

2

Ich bin mir nicht ganz sicher, was Ihr versucht, auszuführen, aber hier ist ein Beispiel für ein Zeichen in Formular AJAX.

Die javascript:

$("#signupForm").on('submit', function(event) { 
    event.preventDefault(); 

    var formData = new FormData(); 
    formData.append('username', $('#username').val()); 
    formData.append('email', $('#email').val()); 
    formData.append('password', $('#password').val()); 
    formData.append('password_confirmation', $('#password_confirmation').val()); 

    $.ajaxSetup({ 
     headers: {'X-CSRF-Token': $('#_token').val()} 
    }); 

    $.ajax({ 
     url: $("#signupForm").attr('action'), 
     method: 'POST', 
     processData: false, 
     contentType: false, 
     cache: false, 
     data: formData, 
     success: function(data) { 
      if(data.success) { 
       window.location = //Desired location for redirect 
      } else { 
       // If the signin wasn't successful. 
      } 
     }, 
     error: function(data) { 
      // If you got an error code. 
     } 
    }); 
}); 

Hier ist, was passiert: Der Code erkennt, wenn das Formular abgeschickt wird, als die Standardaktion verhindert. Es erstellt die Formulardaten, die über AJax gesendet werden. Es sendet die Daten, und wenn es zurückgegeben wird, überprüft es, ob der Erfolgsschlüssel der Daten wahr ist. Wenn dies der Fall ist, leitet es um, oder es macht alles, was es für eine erfolglose Anmeldung tun muss.

PHP-Code:

if($request->ajax()) { 
    $validator = Validator::make($request->all(), /*List of rules*/); 
    if($validator->fails()) { 
     return response()->json([ 
      'success' => false, 
      'message' => '' // Desired return message, normally something like "You username or password is incorrect". 
     ]); 
    } 
    if(Auth::attempt(['email' => $request->input('email'), 'password' => $request->input('password')], $request->input('remember'))) { 
     /* 
     * When the javascript redirects, you may need to flash data to the next page, do it here. 
     * Example: $request->session()->flash(/*Name here*/, /*What you want to flash*/)->reflash(); 
     */ 
     return response()->json([ 
      'success' => true, 
      'route' => // If you desire you can put the route you want to redirect to. 
     ]); 
    } 
    return response()->json([ 
     'success' => false, 
     'message' => '' // Desired return message, normally something like "You username or password is incorrect". 
    ]); 
} 
// Handle if the user doesn't support javascript. 

Hier ist, was passiert: Zunächst einmal, erkennt der Code, ob die Anforderung kam durch Ajax oder nicht. Wenn dies der Fall ist, wird ein Validator erstellt, der überprüft, ob ein Fehler aufgetreten ist. Dadurch können wir unsere JSON-Antwort formatieren, wobei der Erfolg auf "false" gesetzt ist. Wenn es nicht fehlgeschlagen ist, versucht es den Benutzer zu authentifizieren. Wenn der Benutzer erfolgreich authentifiziert wurde, wird "success" => true an den Browser zurückgegeben. Wenn Sie so etwas tun, stellen Sie sicher, dass Sie den Code implementieren, wenn die Anfrage nicht über AJAX erfolgt ist, um Clients mit deaktiviertem Javascript richtig zu unterstützen.

Hoffe, das hilft.

Edit:

Was Ihnen wirklich verwirrend ist zu tun versuchen, so krank versuchen und zu verstehen. Was ich sehen kann, ist der Versuch, eine Hilfsdatei mit einer Menge von Funktionen zu erstellen, auf die Sie in Ihrem Controller zugreifen müssen. Es gibt einige Möglichkeiten, dies zu tun, zum einen mit dem Erstellen einer globalen Hilfsdatei.

In Ihrem composer.json, fügen Sie die folgenden Schritte aus:

"autoload": { 
    "files": [ 
     // Path to the file with your helper functions. 
    ] 
} 

als in Ihrem Controller Sie CallAPI(/*Your params*/) verwenden können. Wenn Sie eine Hilfsklasse deklarieren, deklarieren Sie bitte keine Variablen, sondern nur Funktionen. Alles, was Sie in Ihrer Funktion von woanders benötigen, verwenden entweder die Abhängigkeitsinjektion oder den Wert in die Funktion mit example($test = 5). Wenn Sie eine Klasse von woanders benötigen, verwenden Sie die Klasse am Anfang der Datei: use Session;.

Ihre andere Option ist die Verwendung von Fassaden. Fassaden sind ein guter Weg, um Ihre Funktionen in dort respektierte Kategorien zu teilen. Nehmen wir zum Beispiel eine Farbfassade für alle unsere Farbfunktionen.

Zuerst müssen Sie die Klasse mit allen Funktionen darin erstellen:

namespace App\Helpers\Color; 

class ColorContract 
{ 
    public function foo() { 
     echo "foo"; 
    } 
} 

Als nächstes müssen Sie Ihre Fassade Klasse erstellen:

namespace App\Helpers\Facades; 

use Illuminate\Support\Facades\Facade; 

class ColorFacade extends Facade 
{ 
    protected static function getFacadeAccessor() 
    { 
     return 'Color'; 
    } 
} 

Jetzt müssen Sie binden Color-Klasse der Service-Container. Ich würde empfehlen, dies in Ihrem eigenen Dienstleister zu tun.

Namespace App \ Providers;

verwenden Illuminate \ Support \ ServiceProvider;

Zuletzt, fügen Sie den Alias ​​und den Dienstanbieter in der app.php-Konfigurationsdatei hinzu.

'providers' => [ 
    // Path to your service provider... 
] 

'aliases' => [ 
    'Color' => // Path to your color facade. 
] 

Jetzt in Ihrem Controller würden Sie use Color; hinzufügen. In Ihrer Controller-Methode mit Echo foo.

Ich hoffe, das hilft.

+0

gibt es einfachere Möglichkeiten, ein Formular als serialisieren. Beispiel ist zu komplex, um als Basis verwendet zu werden, wenn keine Dateien hochgeladen werden. – charlietfl

+0

Was würden Sie sonst vorschlagen? – Dastur

+0

Ich habe meine ursprüngliche Frage bearbeitet. Lassen Sie mich Ihre erste Antwort verdauen und ich werde Follow-up veröffentlichen. – sscotti

0

vielleicht möchten Sie

return response()->json(['something'=>'somevalue']); 

mit $.ajax

$.ajax({ 
    url:yourUrl, 
    method:"POST", 
    data:{ 
    as:'object', 
    } 
}).done((response)=>{ 
    //do something with response 
}); 
0

Wenn es sich um eine POST-Anforderung handelt, müssen Sie keine weiteren Argumente in der Route erstellen (das wäre für GET-Anforderungen nützlich), sondern nehmen Sie sie von der Request-Fassade auf der Controllerseite.

Route::post('dicomgrid', '[email protected]'); // good 

Sie benötigen Laravel Anfrage des Klasse zu verwenden, stellen Sie sicher, dass Sie den Namensraum im oberen Teil Controller enthalten sind:

use App\Http\Requests; 

und binden die Anforderungs-Klasse in der Controller-Aktion:

public function apiCall(Request $request){ 

} 

Und Sie sollten alle in der Lage, die übergebenen Daten zu betrachten:

public function apiCall(Request $request){ 
    dd($request->all()) 
}  

oder sie durch ihre Eingangsnamen erhalten:

$request->name || $request->input('name') 

Wenn Sie PhpStorm verwenden ich würde empfehlen Laravel Plugin für Namespace und Klassen automatische Vervollständigung zum Download bereit.

Hoffe das hilft Ihnen, Prost.