Laravel 重定向在从两个不同的方法调用时功能不相似



我正试图点击一个按钮,并将上个月的数据加载到屏幕上。最初它通过当前月份和年份,页面加载工作正常。由于导航按钮点击可以在任何一个月完成,因此它会计算新的月份并传递到相同的方法。但每次点击按钮后的页面加载只返回响应,不会在屏幕上显示数据。你能帮我找出这个问题的原因并解决这个问题吗。这是我的代码片段。

jquery

$(".month-nav-left").click(function(e){
e.preventDefault();
// currently hard coded - just to check
var month = 8;
var year = 2024;
var monthDir = "mBack";
$.ajax({
type:'POST',
url:"{{ route('monthBack') }}",
data:{month:month, year:year, monthDir:monthDir},
success:function(data){
//   alert(data.success);
//   console.log(data);
}
});

路由

use AppHttpControllersCalendarSetupController;
Route::get('/', [CalendarSetupController::class, 'index']);
Route::get('/{year}/{month}', [CalendarSetupController::class, 'monthToDisplay'])->name('selectCalendar');
Route::post('/mback', [CalendarSetupController::class, 'selectMonth'])->name('monthBack');

控制器

<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use IlluminateSupportFacadesView;
class CalendarSetupController extends Controller
{
public function index()
{
$month = (int)date('m');
$year = (int)date('Y');
// This displays data correctly on initial load.
return Redirect::route('selectCalendar', [$year, $month]);
}

public function monthToDisplay()
{    
$year = request()->segment(1);
$month = request()->segment(2);
$list=array();

$month=(date("F", mktime(12, 0, 0, $month, 1, $year)));
return View::make('mainPage', ['date' => $list, 'month' => $month, 'year' => $year]);
}


function selectMonth(Request $request)
{
$input = $request->all();
$month = $input["month"];
$year = $input["year"];

switch($input["monthDir"])
{
case "mBack":
$month = (int)strftime('%m', strtotime('+1 month', mktime(0, 0, 0, $month, 1, $year)));
break;
}
// This only have the correct view in the response, but does not load on the screen.
return Redirect::route('selectCalendar', [$year, $month]);
}
}

谢谢。

monthBack是一个web路由,所有针对它的请求都将通过VerifyCsrfToken中间件,该中间件检查有效令牌。

由于您的ajax请求不包含有效的_token密钥,因此它将被拒绝(未经授权,您可以在实时artisan serve日志中看到HTTP答案(。

如果您没有编辑HTML布局,则标头将已经包含有效的令牌。

<meta name="csrf-token" content="{{ csrf_token() }}" />

以下是如何将该令牌添加到您的POST请求中:

$.ajax({
type: "POST",
url: "{{ route('monthBack') }}",
data: {
month:month, year:year, monthDir:monthDir,
_token:$('meta[name="csrf-token"]').attr('content')
},
success: success,
dataType: dataType
});

或添加

headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},

请注意,该令牌在有限的时间内保持有效,如果您在一段时间内不刷新页面,该按钮将不起作用。

我在javascript代码中添加了一行重定向到所需的url。我不确定这是否是最好的做法,但它确实如预期的那样。谢谢你抽出时间。

$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$(".month-nav-left").click(function(e){
e.preventDefault();
// currently hard coded - just to check
var month = 8;
var year = 2024;
var monthDir = "mBack";
$.ajax({
type:'POST',
url:"{{ route('monthBack') }}",
data:{month:month, year:year, monthDir:monthDir},
success:function(data){
//   alert(data.success);
//   console.log(data);
}
});
window.location.replace("http://127.0.0.1:8000/"+year+"/"+month);
});

如果尝试助手函数redirect()->route('route.name', 'data' => $data);而不是使用Redirect::route()静态方法,会发生什么?

相关内容

  • 没有找到相关文章

最新更新