Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 向Laravel资源控制器发出的AJAX请求,最佳实践_Javascript_Ajax_Laravel_Get - Fatal编程技术网

Javascript 向Laravel资源控制器发出的AJAX请求,最佳实践

Javascript 向Laravel资源控制器发出的AJAX请求,最佳实践,javascript,ajax,laravel,get,Javascript,Ajax,Laravel,Get,我在Laravel中设置了一个资源控制器,具有以下索引功能: public function index() { if (!Auth::check()) { return redirect()->route('login'); } $decks = Auth::user()->decks->sortByDesc('name'); return view('decks.index')->with('decks', $decks

我在Laravel中设置了一个资源控制器,具有以下索引功能:

public function index()
{
    if (!Auth::check()) {
        return redirect()->route('login');
    }
    $decks = Auth::user()->decks->sortByDesc('name');
    return view('decks.index')->with('decks', $decks);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
}
在另一个页面上,我还需要通过AJAX调用使用
$decks
变量。现在,我已经设置了一条通往控制器的额外路线,通过GET请求,我可以从中检索甲板:

public function getDecks()
{
    if (!Auth::check()) {
        return;
    }
    $decks = Auth::user()->decks->sortByDesc('name');
    return response()->json($decks);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
}
我的问题:有没有办法通过直接请求
索引来获取
$decks
变量,或者我的解决方案就是这样

如果我向索引发出get请求,我将获得decks.index视图的HTML,但是如何访问(如果可能)
$decks
变量


我想我没有真正理解的是:在
->with('decks',$decks)
语句中,
$decks
发生了什么?我知道我可以在该页面上使用blade语法访问
$decks
,但是它从哪里访问数据,我也可以通过AJAX访问数据

您不能直接从索引路由检索
$deck
。当您使用(…)
调用
view(…)->时,它会在内部传递给刀片模板处理器,该处理器也会接收
$decks
变量,然后在服务器端生成HTML,然后将“已编译”的HTML返回到浏览器。因此,一旦服务器返回结果,
$decks
变量就不再存在。因为这种行为,你不可能做你想做的事

<> >是的,您的解决方案是这样的,尽管您可以考虑在<代码>中间件中包装<代码> Auth::Cuffor(<代码)>,并将调用移到<代码> $Deks>代码>,以简化代码。


我希望这能回答您的问题,如果有任何不清楚的地方,请随时提问

您的解决方案是正确的。通常,使用路由处理任何业务逻辑或数据检索都不是一个好主意-最好使用控制器,这正是您正在做的。如果要避免控制器中的
If(Auth::check())
语句,可以像这样将
Auth
中间件直接添加到该路由

Route::get('example', 'YourController@index')->middleware('auth');
关于您关于带('decks',$decks)
->的问题: 该函数将
$decks
变量发送到要在刀片模板中渲染的视图。服务器使用该数据呈现页面,然后丢弃该变量。如果您还想使用javascript处理页面上的数据,可以在刀片模板中执行类似操作

<script>
    var decks = {!!$decks->toJSON()!!};
</script>

var decks={!!$decks->toJSON()!!};

是!根据执行的请求类型,可以返回不同的结果。不需要两条路线:

public function index(Request $request)
{
    $decks = Auth::user()->decks->sortByDesc('name');

    if ($request->ajax()) {
        return response()->json(['decks' => $decks]);
    } else {
        return view('decks.index')->with('decks', $decks);
    }
}
@Sven Hakvoort是对的,您应该在路由定义中检查身份验证:

Route::group(['middleware' => 'auth'], function () {
    Route::get('/decks', 'DecksController@index');
    // ... some other routes which requires authentication
}

感谢您的快速回答。OP使用的是控制器,请注意
index
函数和
getdeck
函数,因此部分答案无效;)另外,他不想在页面上使用JS中的数据。问题是,如果他只能从RouteEyes检索JSON,那么Sven是正确的。如果我对这个问题的表述有误导性,我很抱歉。但是谢谢你的评论,我知道OP使用的是控制器,这不是我在回答中说的吗?我只是给出了一个如何在路由中使用中间件的示例。对不起,如果我误解了。是的,你对JS的看法是正确的-我知道这不是问题的确切答案-只是认为这可能是有用的信息-不是,对不起。啊,是的,你是对的。然而,我仍然不建议这样做,因为惯例是API驻留在专用的API路由中(例如,
host/API/v1/…
),混合使用这些路由是不好的做法。因此,我不推荐这种方法,不管它是否可行solution@SvenHakvoort完全正确,但是,如果你使用两条路由,你也应该有一个避免代码重复的服务。是的,绝对正确。我在回答中提到了这一点(不过是作为一种功能,而不是服务)。但这绝对是最好的做法!