【问题标题】:How to add a custom method to resource controller in Laravel 5.6如何在 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 laravel rest routing laravel-5.6


【解决方案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');

其次你必须删除

&lt;input name="_method" type="hidden" value="PATCH"&gt;

或像这样替换您的路线:

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

【讨论】:

  • 将路由调用更改为Route::Patch 对我有用。但是,这是一个有效的方法吗?我找不到很多关于隐藏输入字段 _method 实际上是什么的信息,特别是 PATCH 值的含义......?
  • PATCH 只是 POST、GET、PUT、DELETE、ETC 等休息方法...输入 &lt;input name="_method" 有助于精确确定您想要用于休息调用的方法,因为默认情况下只是 GET 和接受的 POST 方法
【解决方案3】:

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

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

其余的都是正确的。

【讨论】:

  • 删除 $ 后,我现在收到“Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException No message”。这与我添加的方法欺骗输入字段有关吗?
  • @Quhalix89 因为您在表单中传递了patch 方法,但在路由中期望post
猜你喜欢
  • 2016-07-05
  • 2021-10-08
  • 2013-05-15
  • 2020-03-15
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多