我会尝试再简化一下这个问题。在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调用。
这是一个愚蠢的问题或方法吗?
也许这就是我需要的东西?
答案 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({
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以获取命名空间和类自动完成功能。
希望这可以帮助你,欢呼。