如何在 Laravel 5.6 中向资源控制器添加自定义方法
Posted
技术标签:
【中文标题】如何在 Laravel 5.6 中向资源控制器添加自定义方法【英文标题】:How to add a custom method to resource controller in Laravel 5.6 【发布时间】:2019-01-25 20:34:27 【问题描述】:在 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>
很遗憾,除了“抱歉,找不到您要查找的页面”之外,没有任何反应。要显示的页面。
我错过了什么?为了进一步扩展这个问题,这甚至是在数据库条目上实现“单字段更新”的有效方法吗?
感谢您的帮助!
【问题讨论】:
你能不能php artisan route:list
把输出粘贴到这里?
***.com/questions/16661292/…
【参考方案1】:
你已经写了像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.');
【讨论】:
我还要感谢您的评论。您能否简要描述一下使用隐式模型绑定函数的好处是什么?关于视图中的表单,我在表单中提供什么数据(当前为 $user->id)是否重要? 模型绑定为您带来多重好处。首先也是最重要的是概念的澄清和代码的可读性。在您的情况下,最正确的方法是命名路线:` Route::post('/profile/user/approve', 'ProfileController@approve')->name('user-approve'); ` 然后,你可以在你的视图中使用它:`action="route('user-approve', ['user' => $user])"不需要做搜索,Laraver 帮你做,如果用户不存在,它会自动抛出 ModelNotFoundException。享受。太棒了!【参考方案2】:我看到你有两个问题: 首先纠正这样的路线
Route::post('/profile/id/approve', 'ProfileController@approve');
其次你必须删除
<input name="_method" type="hidden" value="PATCH">
或像这样替换您的路线:
Route::patch('/profile/id/approve', 'ProfileController@approve');
【讨论】:
将路由调用更改为Route::Patch
对我有用。但是,这是一个有效的方法吗?我找不到很多关于隐藏输入字段 _method 实际上是什么的信息,特别是 PATCH 值的含义......?
PATCH 只是 POST、GET、PUT、DELETE、ETC 等休息方法...输入 <input name="_method"
有助于精确确定您想要用于休息调用的方法,因为默认情况下只是 GET 和接受的 POST 方法【参考方案3】:
您希望从您的路线中删除 $
标志:
Route::post('/profile/id/approve', 'ProfileController@approve');
其余的都是正确的。
【讨论】:
删除 $ 后,我现在收到“Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException No message”。这与我添加的方法欺骗输入字段有关吗? @Quhalix89 因为您在表单中传递了patch
方法,但在路由中期望post
。以上是关于如何在 Laravel 5.6 中向资源控制器添加自定义方法的主要内容,如果未能解决你的问题,请参考以下文章