Laravel:无法创建正确的DELETE操作请求

时间:2016-01-18 10:59:38

标签: ajax laravel-5

无法在Laravel中创建删除操作。

我一直收到Not FoundToken mismatch错误。

我的控制器:

class TranslationController extends Controller
{
    public function destroy($id)
    {       
        //$id = 1;
        /*$translation = Translation::find($id);
        $translation->delete();*/
    }
    ....
}

Ajax电话:

/* Delete given translation */
    var url = "translation";
    var id = 1; 

    $.ajax({
        method: 'DELETE',
        url: url + '/' + id,
        // data: {'id': id, '_token': token},
        success: function() {

        }
    });

这将给出:TokenMismatchException in VerifyCsrfToken.php line 53:

如果我尝试:

url: url + '/' + id,            
data: {'_token': token},  // token is equal to csrf_token

我有:NotFoundHttpException in Controller.php line 269:

路线:

Route::controller('translation', 'TranslationController');

否则我使用的是Laravel 5默认中间件,我没有改变任何与csrf相关的内容。

4 个答案:

答案 0 :(得分:4)

NotFoundHttpException表示尚未指定具有特定 HTTP谓词的特定请求的路由,或者操作(即映射到路由动词的控制器方法)被错误地实现。

由于您在帖子中提到TranslationController被定义为implicit controller

Route::controller('translation', 'TranslationController');

并且从您发布的控制器代码中,很明显您没有为控制器destroy中的TranslationController方法定义动词

如果在项目根目录中使用终端/命令行界面执行php artisan route:list,您将看到已注册的HTTP谓词的列表,映射到相应的URI以及操作。

要在隐式控制器中定义特定方法,动词GETPUTPOSTDELETE)应位于隐式控制器之前实际功能名称。 确保destroy方法在控制器中如下所示:

public function deleteDestroy($id){  
   //delete logic for the resource
}

注意: Laravel默认情况下要求csrf令牌与特定RESTful请求一起传递,因此请勿从data: {'_token': token}电话中删除AJAX

更新

忘记提及你的AJAX调用中的url也应该更改为以下内容才能工作,因为这是Laravel的隐式控制器定义DELETE请求的路由的方式:

var url = "translation/destroy";

答案 1 :(得分:2)

Here是有关方法欺骗的文档。您需要将_method字段设置为DELETE

的POST ajax请求发送
$.ajax({
    method: 'POST',
    url: url + '/' + id,
    data: {
        'id': id,
        '_token': token,
        '_method' : 'DELETE'
    },
    success: function() {

    }
});

答案 2 :(得分:1)

您可以尝试以这种方式定义路线

Route::delete('translation/{id}',array('uses' => 'TranslationController@destroy'));

在这种情况下,你的AJAX不会改变。但如果你想保留这条路线

Route::controller('translation', 'TranslationController');

您必须将Ajax请求更改为:

/* Delete given translation */
var url = "translation/destroy"; // You must specify the action
var id = 1; 

$.ajax({
    method: 'DELETE',
    url: url + '/' + id,
    data: {'_token': token},
    success: function() {

    }
});

答案 3 :(得分:0)

您应该通过标头发送令牌。 (特别是在5.2版本中)

    $.ajax({
            type: "post", 
            url: "/routeurl",
            headers: { 'X-CSRF-Token': "{!! csrf_field() !!}" }, 
            success: function(msg){

                 // msg
                     }
            });