如何在 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');

其次你必须删除

&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

以上是关于如何在 Laravel 5.6 中向资源控制器添加自定义方法的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 中向 API 资源链接添加参数 [重复]

如何在 laravel 中向手动注册事件监听器添加测试?

如何在 Laravel 5.6 中将数组插入数据库

Laravel 5.6:自定义分页资源集合元和链接属性

如何在 laravel 中为资源控制器添加自定义函数?

如何在刀片视图 laravel 5.6 中访问定义的关系