如何在Laravel 5.6中向资源控制器添加自定义方法

时间:2018-08-19 14:04:32

标签: php laravel rest routing laravel-5.6

在Laravel 5.6中向资源控制器添加自定义方法的正确方法是什么?

到目前为止,我的ProfileController中有一种新方法:

public function approve($id){
    $user = User::find($id);
    $user->state = '1';
    $user->save();
    return redirect('/dashboard')->with('success', 'User approved.');
}

以及以下几行添加到我的web.php文件中:

Route::post('/profile/{$id}/approve', 'ProfileController@approve');
Route::resource('profile', 'ProfileController');

我认为表单正确(afaik)呈现为:

<form method="POST" action="http://myurl.com/profile/10/approve" accept-charset="UTF-8">
    <input name="_token" type="hidden" value="v3F1RRhi7iJL2o4egOhcRiuahaGQBwkGkfMal1lh">
    <input name="_method" type="hidden" value="PATCH">
    <input class="btn btn-success" type="submit" value="Approve User">
</form>

很遗憾,什么都没有发生,除了“抱歉,找不到您要查找的页面”。要显示的页面。

我想念什么?还要扩展这个问题,这甚至是在数据库条目上实现“单字段更新”的有效方法吗?

谢谢您的帮助!

3 个答案:

答案 0 :(得分:1)

您希望从路线中删除$符号:

Route::post('/profile/{id}/approve', 'ProfileController@approve');

其余的都是正确的。

答案 1 :(得分:1)

我看到您有两个问题: 首先像这样纠正路线

Route::post('/profile/{id}/approve', 'ProfileController@approve');

第二步,您必须删除

<input name="_method" type="hidden" value="PATCH">

或这样替换您的路线:

Route::patch('/profile/{id}/approve', 'ProfileController@approve');

答案 2 :(得分:0)

您已经编写了类似var:$ id的参数,并且可以不使用'$'来编写它。 但是实际上您可以使用Laravel隐式模型绑定函数来做到这一点:

Route::post('/profile/{user}/approve', 'ProfileController@approve');

然后在您的控制器中:

public function approve(User $user){
    // Delete this line--> $user = User::find($id);
    $user->state = '1';
    $user->save();
    return redirect('/dashboard')->with('success', 'User approved.');
}