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 的菜鸟!

【问题讨论】:

谁投票结束我的问题,因为它是题外话,请解释 您的路线仅指定 GETHEAD 允许的 /projects/create 方法,但您使用 POST 方法提交表单。调整您的路线文件以接受POST 我现在明白了,谢谢。 @Zerp 指出我的操作需要简单地指向 /projects 以便我存储 你当然可以用任何你想要的方式解决这个问题,但最重要的是,由于你使用了一个在路由文件中没有定义的方法,所以引发了异常。 【参考方案1】:

你应该POSTing 到资源 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 实际上在所有&lt;form&gt; 标签中都使用了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中带有前缀的路由组中的路由资源

Laravel 5.7 使用某些命名空间的资源控制器路由名称是啥?

使用路由 Laravel 5.2 时访问资源时出错

路由资源更新和删除无法使用除存储 laravel 8 之外的多个角色

Laravel 5 - 带有消息“无法准备路由”的异常“LogicException”

在 laravel 5.6 中无法使用邮递员使用 api 路由