使用Laravel 4.2,我有一个这样的资源控制器设置:
Route::resource('faq', 'ProductFaqController');
当我在服务器上点击/faq
URL时,控制器的index()
方法正确加载。
在js文件中,我想对这个资源控制器的其他动作之一进行ajax调用,例如,store
动作。因此,我这样做:
$.ajax({
url:'store',
dataType:'json',
success:function(data){
console.log(data);
}
});
我遇到的问题是,因为URL是/faq
(没有尾斜杠),ajax调用得到/store
,而不是/faq/store
。
我在这里错过了什么,或者我需要前缀url为我所有的ajax调用的路由?
如果我确实需要添加某种前缀,我如何获得适当的前缀来使用,无论资源控制器被调用?
在命令行中运行此命令,它将列出所有URL路由以及它们所附加的控制器方法:
$ php artisan routes # Laravel 4
$ php artisan route:list # Laravel 5
按原样创建资源控制器创建7个不同的路由。这些路由都没有在URL中包含store
。控制器上存在store
方法,但是响应对URL /faq
的POST请求(在您的示例中)
这个问题的解决方案
将您的jQuery更改为POST而不是GET您的数据(这是默认的),并将AJAX url更改为'/faq'
。然后它应该在那个点到达正确的路线。
就能够在不知道实际路由的情况下击中资源控制器路由而言,这从表面上看是不可能的(想想在不知道google.com存在的情况下试图访问google.com)。我想无论如何我理解你的意图。我假设AJAX请求是作为对某些用户操作(如单击按钮)的响应发送的。你可以给那个按钮附加一个data属性和你想要的值,这样你就可以以一种与资源无关的方式发出这些请求。
像这样:
<button class="test" data-resource="faq">Click me!</button>
$('.test').on('click', function(e) {
var resource = $(this).data("resource");
$.ajax({
url: '/' + resource,
dataType:'json',
type: 'post',
success:function(data){
console.log(data);
}
});
});
公认的答案没有回答我的问题,也许是因为我问得不好。我的问题是,我想利用Laravel的路由命名功能,这样我就不必把"faq"这个词硬编码到我所有的JS文件中。如果控制器的名称发生了变化,那么我需要在每个js文件中进行更改。在做了更多的研究之后,我发现这个图书馆正是我一直在寻找的。我还没有尝试实现它,但它似乎完成了我需要的:https://github.com/fedeisas/laravel-js-routes.