Laravel 5:无法发布路由资源
Posted
技术标签:
【中文标题】Laravel 5:无法发布路由资源【英文标题】:Laravel 5: Can't POST to route resource 【发布时间】:2015-10-14 10:35:05 【问题描述】:我有一个路由资源 Route::resource('projects', 'ProjectsController');
,当我运行 route:list
时,我可以看到 POST 可用。
+--------+----------+--------------------------+------------------+--------------------------------------------------------------+-----------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+----------+--------------------------+------------------+--------------------------------------------------------------+-----------------+
| | GET|HEAD | projects | projects.index | App\Http\Controllers\ProjectsController@index | auth |
| | POST | projects | projects.store | App\Http\Controllers\ProjectsController@store | auth |
| | GET|HEAD | projects/create | projects.create | App\Http\Controllers\ProjectsController@create | auth |
| | GET|HEAD | projects/projects | projects.show | App\Http\Controllers\ProjectsController@show | auth |
| | PUT | projects/projects | projects.update | App\Http\Controllers\ProjectsController@update | auth |
| | PATCH | projects/projects | | App\Http\Controllers\ProjectsController@update | auth |
| | DELETE | projects/projects | projects.destroy | App\Http\Controllers\ProjectsController@destroy | auth |
| | GET|HEAD | projects/projects/edit | projects.edit | App\Http\Controllers\ProjectsController@edit | auth |
+--------+----------+--------------------------+------------------+--------------------------------------------------------------+-----------------+
当我在/projects/create
(显示我的表单)并点击我的提交按钮时,我收到一条错误消息:
MethodNotAllowedHttpException in RouteCollection.php line 201:
at RouteCollection->methodNotAllowed(array('GET', 'HEAD', 'PUT', 'PATCH', 'DELETE')) in RouteCollection.php line 188
这也许是我定义我的<form>
标签的方式吗?我没有使用正确的操作吗?
<form method="post" action="">
我也试过<form method="post" action=" url('projects/store') ">
对不起,我是 laravel 的菜鸟!
【问题讨论】:
谁投票结束我的问题,因为它是题外话,请解释 您的路线仅指定GET
和 HEAD
允许的 /projects/create
方法,但您使用 POST
方法提交表单。调整您的路线文件以接受POST
。
我现在明白了,谢谢。 @Zerp 指出我的操作需要简单地指向 /projects
以便我存储
你当然可以用任何你想要的方式解决这个问题,但最重要的是,由于你使用了一个在路由文件中没有定义的方法,所以引发了异常。
【参考方案1】:
你应该POST
ing 到资源 url,而不是资源/创建。
换句话说,只要确保表单的操作是action="/projects"
而不是action="/projects/create"
编辑: 我将把它留在这里,因为它有点相关,并且因为我最初发布了它,但预先警告它是矫枉过正的,并且对于刚开始的人来说有很多不相关的代码。
例如,这是来自我的一个网站的刀片 sn-p:
@extends('layouts.master')
@section('title', 'Create a Project')
@section('content')
<h3>Create a Project</h3>
<hr/>
!! Form::open(['action'=>'ProjectController@store']) !!
@include('forms/partials/edit_form', ['submit_button_label' => 'Add Project'])
!! Form::close() !!
@include('errors.list')
@endsection
【讨论】:
啊,成功了!我可能也应该以这种方式而不是 html 开始创建我的表单。谢谢@Zerp。我会在 5 分钟内接受你的答复。 谢谢。如果您想了解更多信息,我会推荐 laracasts.com 上的“Laravel 5 Fundamentals”系列。 几个月前,当我有一些停机时间时,我实际上看过所有这些。我现在实际上在一个实际项目中使用 L5,所以我可能应该注意复习。 避免 Laravel 5 中常见的表单陷阱的最佳方法是使用 Zerp 已经建议的FormBuilder
(laravel.com/api/4.2/Illuminate/Html/FormBuilder.html)。
是的,我刚刚在我的项目中安装了它【参考方案2】:
Laravel 实际上在所有<form>
标签中都使用了method="POST"
。
你需要的是:
<input type="hidden" name="_method" value="DELETE">
DELETE
也可以替换为其他 HTTP 动词(PUT、PATCH、UPDATE 等)
【讨论】:
或者您可以使用表单助手,它会为您完成所有工作。 如果我想在数据库中存储一些东西,你能详细说明为什么我需要 DELETE 吗? 你没有。只是语法的一个例子。以为您可能对如何设置该方法感到困惑。重新阅读问题我认为这个答案是毫无意义的。 知道了,我现在正在使用表单生成器,因此设置方法非常容易。还是谢谢【参考方案3】:我看到自上次回复以来 Laravel 已经更新。无论如何,我今天遇到了同样的问题,这是我解决它的方法。
基本上我的路由现在是这样的:
// Resourcing routes: https://laravel.com/docs/5.3/controllers#resource-controllers
Route::resource('admin/photos', 'Admin\AdminPhotosController');
// need to do this to enable the store method on the following route (otherwise POST is on index when resourcing controllers)
Route::any('admin/photos/create', 'Admin\AdminPhotosController@create');
Route::post('admin/photos/create', 'Admin\AdminPhotosController@store');
希望对某人有所帮助。
【讨论】:
以上是关于Laravel 5:无法发布路由资源的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.7 使用某些命名空间的资源控制器路由名称是啥?
路由资源更新和删除无法使用除存储 laravel 8 之外的多个角色