如何解决RouteCollection.php第218行中的MethodNotAllowedHttpException :?

时间:2016-12-18 22:58:49

标签: php laravel url routes laravel-5.3

我的观点是这样的:

@foreach($users as $user)
    <tr>
        <td>{!! $user->id !!}</td>
        <td>{!! $user->username !!}</td>
        <td>{!! $user->phone !!}</td>
        <td>{!! $user->address !!}</td>
        <td>
            {!! Form::open(['route' => ['users.destroy.year', $user->id, $year], 'method' => 'delete']) !!}
            <div class='btn-group'>
                <a href="{!! route('users.edit', [$user->id]) !!}" class='btn btn-default btn-xs'><i class="glyphicon glyphicon-edit"></i></a>
                {!! Form::button('<i class="glyphicon glyphicon-trash"></i>', ['type' => 'submit', 'class' => 'btn btn-danger btn-xs', 'onclick' => "return confirm('Are you sure?')"]) !!}
            </div>
            {!! Form::close() !!}
        </td>
    </tr>
@endforeach

我的路线\ web.php是这样的:

Route::get('users/destroy/{year}', 'UserController@destroy')->name('users.destroy.year');

Route::resource('users', 'UserController');

我的控制器是这样的:

public function destroy($id, $year)
{
    $user = $this->userRepository->findWithoutFail($id);

    if (empty($user)) {
        Flash::error('User not found');

        return redirect(route('users.index.year', ['year' => $year]));
    }

    $this->userRepository->delete($id);

    Flash::success('User deleted successfully.');

    return redirect(route('users.index.year', ['year' => $year]));
}

存在这样的错误:

MethodNotAllowedHttpException in RouteCollection.php line 218:

网址如下:http://localhost/mysystem/public/users/2?2016

点击按钮删除后,我希望网址如下所示:http://localhost/mysystem/public/users/index/2016

有没有人可以帮助我?

3 个答案:

答案 0 :(得分:3)

在您的视图中,您已将表单方法声明为DELETE;但是在routes\web.php文件中,您已将路由声明为GET

更改视图

{!! Form::open(
    ['route' => ['users.destroy.year', $user->id, $year],
    'method' => 'get']
  )!!}

您的routes/web.php应如此,

Route::get('users/index/{year}', 'UserController@index')
     ->name('users.index.year');
Route::get('users/destroy/{id}/{year}', 'UserController@destroy')
     ->name('users.destroy.year');
Route::resource('users', 'UserController', ['except' => ['index', 'destroy']]);

保持您的控制器代码不变。

这应该可以解决问题。

只是一个建议

最好不要在GET请求上保留删除操作。因此,像这样更改DELETE路线

Route::delete('users/destroy/{id}/{year}', 'UserController@destroy')
     ->name('users.destroy.year');

更改视图

{!! Form::open(
    ['route' => ['users.destroy.year', $user->id, $year],
    'method' => 'delete']
  )!!}

答案 1 :(得分:2)

HTML表单不支持PUT,PATCH或DELETE操作。因此,在定义从HTML表单调用的PUT,PATCH或DELETE路由时,您需要向表单添加隐藏的_method字段。使用_method字段发送的值将用作HTTP请求方法:

<form action="/foo/bar" method="POST">
    <input type="hidden" name="_method" value="DELETE">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>

答案 2 :(得分:0)

id未在路线中宣布,可能是这是原因,因此改变路线:

Route::get('users/destroy/{year}', 'UserController@destroy')->name('users.destroy.year');

到这个

Route::get('users/destroy/{id}/{year}', 'UserController@destroy')->name('users.destroy.year');

希望这能解决这个问题。