从Laravel View发出jQuery AJAX请求

时间:2016-07-21 23:03:47

标签: php jquery ajax laravel laravel-5.2

我会尝试再简化一下这个问题。在index.blade.php中,我有这个AJAX调用,它被路由到我的控制器。我在select元素中添加了一个“name”,以便表单序列化更容易,我省略了表单。它的POSTS参数:

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

在routes.php中我有这个:

Route::post('dicomgrid', 'DicomGridController@apiCall');

由Contoller处理,现在就是这个。我不得不添加使用Illuminate \ Http \ Request来使它工作。

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

那部分有效。

然而,我当时想要做的就是进行AJAX调用(不确定你是否可以使用jQuery或其他方法在Controller类中做到这一点,这样我回到原始调用的是我通过第二个请求。必须有更好的方法来做到这一点,但我确实喜欢让控制器为该特定应用程序的所有请求提供服务。我真的只是开始使用它,所以它主要是一个学习锻炼。

详细说明,具有我的一些功能的PHP页面是这样的,缩减版本:

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

同一页面上还有其他函数依赖于初始化变量和特别是$ curl。但最重要的是我以JSON格式或其他一些文本(如格式化的数组print_f)检索一些结果,主要用于开发和测试。这就是我希望控制器处理该功能集的原因。

所以我想我的问题是如何在Controller中调用我的函数并将结果返回给我原来的AJAX调用。

这是一个愚蠢的问题或方法吗?

也许这就是我需要的东西?

Calling a function within a Class method?

3 个答案:

答案 0 :(得分:2)

我不确定你要尝试的是什么,但这里有一个使用AJAX签名的例子。

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

以下是发生的情况:代码检测表单的提交时间,而不是阻止默认操作。它创建要通过ajax发送的表单数据。它发送数据,当它返回时,它检查数据的成功密钥是否为真。如果是这样,它会重定向,否则,它会为不成功的登录做任何需要做的事情。

PHP代码:

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.

以下是发生的事情:首先,代码检测请求是否来自ajax。如果是,则创建验证器而不是检查它是否失败。通过这样做,我们可以格式化我们的JSON响应,并将成功设置为false。如果它没有失败,它会尝试验证用户。用户成功通过身份验证后,会将"success" => true返回给浏览器。在做这样的事情时,如果请求没有通过ajax来正确支持关闭Javascript的客户端,请确保执行代码。

希望这有帮助。

编辑:

你想要做的事情真是令人困惑,所以不好尝试和理解。从我所看到的,您尝试使用需要在控制器中访问的大量函数来创建帮助文件。有几种方法可以做到这一点,一种是制作全局帮助文件。

在您的composer.json中,添加以下内容:

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

在控制器中,您可以使用CallAPI(/*Your params*/)。声明辅助类时,请不要声明变量,只使用函数。您在其他地方的函数中需要的任何东西都使用依赖注入,或者使用example($test = 5)将值注入函数。当您需要来自其他地方的课程时,请使用文件顶部的课程:use Session;

你的另一个选择是使用外墙。外墙是将功能划分为受尊重类别的好方法。例如,让我们为所有颜色函数创建一个颜色外观。

首先,您需要创建包含所有函数的类:

namespace App\Helpers\Color;

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

接下来,您需要创建外观类:

namespace App\Helpers\Facades;

use Illuminate\Support\Facades\Facade;

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

现在,您需要将Color类绑定到服务容器。我建议你在自己的服务提供商中这样做。

命名空间App \ Providers;

使用Illuminate \ Support \ ServiceProvider;

class HelperServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->bind("Color", function() {
            $this->app->make("App\\Helpers\\Color\\Color");
        });
    }
}

最后,在app.php配置文件中添加别名和服务提供程序。

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

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

现在,您可以在控制器中添加use Color;。在您的控制器中,使用Color::foo()的方法将回显foo

我希望这会有所帮助。

答案 1 :(得分:0)

也许你想要

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

$.ajax

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

答案 2 :(得分:0)

如果它是POST请求,则不需要在路由中创建更多参数(这对GET请求有用),而是从控制器端的Request facade中获取它们。

Route::post('dicomgrid', 'DicomGridController@apiCall'); // good

您需要使用Laravel的Request类,确保您已将命名空间包含在控制器的顶部:

use App\Http\Requests;

并在控制器操作中绑定Request类:

public function apiCall(Request $request){

}

您应该能够使用以下方式查看所有传递的数据:

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

或通过输入名称获取它们:

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

如果您使用的是PHPStorm,我建议您下载Laravel Plugin以获取命名空间和类自动完成功能。

希望这可以帮助你,欢呼。