无法在Laravel中创建删除操作。
我一直收到Not Found
或Token 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相关的内容。
答案 0 :(得分:4)
NotFoundHttpException
表示尚未指定具有特定 HTTP谓词的特定请求的路由,或者操作(即映射到路由动词的控制器方法)被错误地实现。
由于您在帖子中提到TranslationController
被定义为implicit controller,
Route::controller('translation', 'TranslationController');
并且从您发布的控制器代码中,很明显您没有为控制器destroy
中的TranslationController
方法定义动词。
如果在项目根目录中使用终端/命令行界面执行php artisan route:list
,您将看到已注册的HTTP谓词的列表,映射到相应的URI以及操作。
要在隐式控制器中定义特定方法,动词(GET
,PUT
,POST
,DELETE
)应位于隐式控制器之前实际功能名称。
确保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
$.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
}
});