在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>
很遗憾,什么都没有发生,除了“抱歉,找不到您要查找的页面”。要显示的页面。
我想念什么?还要扩展这个问题,这甚至是在数据库条目上实现“单字段更新”的有效方法吗?
谢谢您的帮助!
答案 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.');
}