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

How to add a custom method to resource controller in 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>

遗憾的是,除了要显示的 "Sorry, the page you are looking for could not be found." 页面外,什么也没有发生。

我错过了什么?并进一步扩展这个问题,这甚至是在数据库条目上实现 "single field updates" 的有效方法吗?

感谢您的帮助!

您希望从您的路线中删除 $ 标志:

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

其余部分正确。

我看到你有两个问题: 先把路线改成那样

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

其次你必须删除

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

或者像这样替换你的路线:

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

你写了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.');
}