【问题标题】:Sometimes laravel calls another route instead of real one有时 laravel 调用另一条路线而不是真正的路线
【发布时间】:2016-04-12 17:48:10
【问题描述】:

在 laravel routes.php 文件中,我有以下代码:

// User Resourceful Routing
Route::resource('user','UserController');

默认情况下delete 路由转到UserControllershow 方法。为了克服这个问题,我在 laravel routes.php 中写了这条路线:

// Delete Users Route
Route::get('user/{user}/{flag}', ['uses' => 'UserController@destroy', 'as'=>'user.destroy'])->before('permission:user_delete');

它仍然对我有用,但有时(十分之二)它会转到 UserControllershow 方法而不是 destroy 方法。

// Destroy method
public function destroy($id,$flag='normal'){
}

我们非常感谢您的建议。

【问题讨论】:

  • 使用资源控制器时,必须使用正确的HTTP方法,例如GETPOSTDELETE。如果你没有在请求中指定 DELETE 方法,Laravel 会认为你正在使用 GET 方法,并会调用 show() 而不是 destroy()
  • @MikeRockett:我知道这一点,但您可以通过 API 选择删除方法,但浏览器没有删除方法。当您通过浏览器发出请求时,就会出现此问题。
  • 这种情况只是偶尔发生。其他时候对我来说效果很好。
  • 您必须使用带有隐藏 _method=delete 和 method=post 的表单,通过网络浏览器通过方法欺骗发送删除请求。
  • lagbox 是正确的,如果您不使用 AJAX,则方法欺骗是可行的方法。

标签: laravel laravel-4 laravel-routing


【解决方案1】:

你应该使用'delete'方法而不是get。

你可以像这样在 laravel 中使用。

{!! Form::open(['action' => ['UserController@destroy', $user->id], 'method' => 'delete']) !!}
  {!! Form::submit('Delete User') !!}
{!! Form::close() !!}

如果你使用的是ajax,你可以这样使用。

$.ajax({
        type: "DELETE",
        url: 'users/' + user_id,
        success: function(affectedRows) {
        }
    });

如果你不想使用 laravel 的默认销毁方法,那么你可以使用 delete_user 方法和 post 操作。

【讨论】:

  • 浏览器没有删除方法。 laravel delete 方法仅适用于 API。
  • DELETE 方法并非对所有浏览器全局可用。甚至 jQuery 官方文档也没有在 ajax 中显示这种方法。无论如何感谢您的回答 +1。
  • 如果我没记错的话,Form 在 Laravel 中不再可用。您需要为此下载单独的软件包。您的答案应包含原始代码,包括方法欺骗 (<input type="hidden" name="_method" value="DELETE">)。
  • @MikeRockett:在您选择迁移到 Laravel 5 之前,它一直支持。我的项目仍处于版本 4。所以一切正常。
【解决方案2】:

明确定义您的路线,而不是使用资源,毕竟它们是 3 或 4。除了 destroy 方法。

然而,我会首先通过php artisan route:list 调试当前路由并检查您的端点。发送请求时,您可能在某处缺少参数。

【讨论】:

  • 我试过了。我已经运行了 php artisan 路线并获得了所有路线。谢谢你的建议。这是我做的第一步。
猜你喜欢
  • 2017-07-09
  • 2016-01-09
  • 1970-01-01
  • 2018-09-05
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-23
相关资源
最近更新 更多