Laravel资源控制器ajax调用

时间:2014-08-13 17:52:26

标签: php ajax laravel laravel-4

使用Laravel 4.2,我有一个像这样的资源控制器设置:

Route::resource('faq', 'ProductFaqController');

当我点击服务器上的/faq网址时,控制器的index()方法会正确加载。

在js文件中,我想对此资源控制器的其他操作之一进行ajax调用,例如store操作。因此,我这样做:

 $.ajax({
    url:'store',
    dataType:'json',
    success:function(data){
        console.log(data);
    }
});

我遇到的问题是,由于网址为/faq(没有尾部斜杠),因此ajax调用将发送到/store,而不是/faq/store

我是否在这里遗漏了某些内容,或者我是否需要为该路线的所有ajax调用添加前缀?

如果我确实需要添加某种前缀,无论是否调用资源控制器,如何使用相应的前缀?

2 个答案:

答案 0 :(得分:4)

从命令行运行它,它将列出所有链接在一起的URL路由及其附加的控制器方法:

$ php artisan routes     # Laravel 4
$ php artisan route:list # Laravel 5

按原样创建资源控制器会创建7条不同的路由。这些路由中没有一个在URL中的任何位置包含store。控制器上存在store方法,但响应对URL /faq的POST请求(在您的示例中)

问题的解决方案

将您的jQuery更改为POST而不是GET您的数据(这是默认设置),并将您的AJAX网址更改为'/faq'。然后它应该在那时达到正确的路线。

只要能够在不知道实际路线的情况下点击资源控制器路线,就不可能(考虑尝试访问google.com而不知道google.com存在)。但我想我明白你要做什么。我假设AJAX请求是作为对某些用户操作的响应而发送的,例如单击按钮。您可以使用您想要的值将数据属性附加到该按钮,以便您可以以与资源无关的方式发出这些请求。

这样的事情:

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

答案 1 :(得分:0)

接受的答案没有回答我的问题,也许是因为我问得不好。我的问题是,我想利用Laravel的路由命名功能,这样我就不必将“faq”这个词硬编码到我的所有JS文件中。如果该控制器的名称发生变化,那么我需要在每个js文件中进行更改。在做了一些研究之后,我发现这个库就是我想要的。我还没有尝试过实现它,但它似乎完成了我的需要:https://github.com/fedeisas/laravel-js-routes