Php 此路由不支持POST方法。支持的方法:GET,HEAD。拉维尔

Php 此路由不支持POST方法。支持的方法:GET,HEAD。拉维尔,php,laravel,Php,Laravel,我的编辑页面有问题。当我提交时,我收到以下错误: 此路由不支持POST方法。支持的方法:GET,HEAD 我不知道它是从哪里来的,因为我对拉雷维尔还很陌生 路由(web.php): 控制器: public function edit($id) { return view('project.edit',[ 'project' => Project::find($id) ]); } /** * Up

我的编辑页面有问题。当我提交时,我收到以下错误:

此路由不支持POST方法。支持的方法:GET,HEAD

我不知道它是从哪里来的,因为我对拉雷维尔还很陌生

路由(web.php):

控制器:

 public function edit($id)
    {
        return view('project.edit',[

            'project' => Project::find($id)
        ]);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request)
    {
        $project = Project::find($request->id);
        $project->project_name = $request->input('project_name');
        $project->client = $request->input('client');
        $project->description = $request->input('description');
        $project->time_span = $request->input('time_span');
        $project->text_report = $request->input('text_report');
        $project->created_by = $request->input('created_by');

        $project->save();

        return  redirect('/')->with('success', 'Project aangepast');
    }

我在web.php中看到您的代码如下:Route::post('/edit/{id}','ProjectController@update');

步骤1:删除{id}随机参数,使其如下:Route::post('/edit','ProjectController@update');

第2步:然后删除表单中的@method('PUT'),这样我们就可以简单地使用POST方法

那么如何将ID传递给我的方法

步骤1:使用隐藏属性在表单中创建一个输入字段 比如说

步骤2:在控制器中的更新方法中,获取该ID 例如:

$id = $request->input('id');
然后,您可能无法使用它来查找要编辑的项目

$project = Project::find($id)
//OR
$project = Project::where('id',$id);

有多种方法可以处理此问题:

  • 如果您坚持使用
    PUT
    ,您可以将表单操作更改为
    POST
    ,并添加一个隐藏的
    method\u字段
    ,该字段具有值
    PUT
    和一个隐藏的csrf字段(如果您使用的是blade,则只需添加
    @csrf\u字段
    {{method\u字段('PUT')}
    )。这样,表单将接受请求

  • 您只需将路由和表单方法更改为
    POST
    。因为您是定义路由而不使用资源组的人,所以它可以正常工作


  • 嗨,你不必写所有的路线,只要遵循惯例就行了 选中:由资源控制器处理的操作部分

    由于HTML表单不能发出PUT、PATCH或DELETE请求,因此需要添加一个隐藏的方法。从n laravel发布数据时,您必须使用

    <form action="/foo/bar" method="POST">
    @method('PUT')
    </form>
    
    
    @方法('PUT')
    
    我知道这不是OPs post的解决方案。然而,当我搜索这个错误的答案时,这篇文章是第一篇被谷歌编入索引的文章。因此,我觉得这将有利于其他人

    以下错误

    此路由不支持POST方法。支持 方法:获取,头部

    由于未清除路由缓存而导致

    php artisan route:cache
    

    主要是这种错误产生,, 1.首先检查一个代码,在代码中,我们定义@csrf


    解决此问题的简单方法是将其添加到表单中

    {{ csrf_field() }}
    <input type="hidden" name="_method" value="PUT">
    

    我有一个类似的问题,唯一的解决办法是重新启动我用作开发环境的vagrant。除此之外,没有一个artisan和composer命令没有帮助

    我刚刚删除了url末尾的斜杠,它开始工作了。。。
    /managers/games/id/push/
    发送至:

    $http({
      method: 'POST',
      url: "/managers/games/id/push",
    
    这可能与升级到laravel 5.8有关。

    在表单上添加@method('PUT')

    经验:

    
    @csrf
    @方法('PUT')
    
    如果您使用的是Route::group,以及类似于LaravelLocalization(来自MCAMARA)的供应商插件,则需要将POST路由置于该组之外。我在使用这个插件发布路由时遇到了一些问题,我现在通过将这些路由放在Route::group之外解决了这些问题。

    在我的例子中,只需运行命令,就可以很好地工作了

    php artisan route:clear
    

    您的路线有问题,请使用以下代码:

    在第8章: web.php:

    应用程序/Http/控制器:

    <?php
    namespace App\Http\Controllers\Projects;
    
    use App\Http\Requests\Project\ProjectRequest;
    use Illuminate\Http\Request;
    use App\Http\Controllers\Controller;
    
    class ProjectController extends Controller {
        //---Constructor Function
        public function __construct() {
            $this->middleware('auth:sanctum');
        }//---End of Function Constructor
    
        //---List Product
        public function index() {
        }//---End of Function index
    
        //---Create
        public function Create() {
        }//---End of Function Create
    
        //---Store
        public function Store(ProjectRequest $request) {
        }//---End of Function Store
    
        //---Show
        public function Show($project) {
        }//---End of Function Show
    
        //---Destroy
        public function Destroy($project) {
        }//---End of Function Destroy
    
        //---Edit
        public function Edit($project) {
        }//---End of Function Edit
    
        //---Update
        public function Update(ProjectRequest $request, $project) {
        }//---End of Function Update
    }
    ?>
    
    
    

    是的,我的问题是相同的。但在另一方面。您的错误是由您的查询引起的。如果要查看错误,需要使用此路由的GET方法。就你我而言,我们使用的是邮政。这样我们就看不到真正的错误消息…

    您当前通过PUT方法调用update controller方法。将表单更改为使用PUT或更改行路由::PUT('/edit','ProjectController@update'); 发送::post('/edit','ProjectController@update');谢谢你的评论,但是当我用post替换put并返回一个新错误时:从空值创建默认对象当你找到项目时,你还应该检查find()返回一个有效的项目对象,而不是null。你考虑过使用
    资源
    路由/控制器吗?您可以只使用
    Route::resource('projects','ProjectController')设置所有必要的路线。它仍然返回:此路由不支持PUT方法。支持的方法:POST。请填写错误消息或至少给我一张您表单的屏幕截图,错误消息我仍然看不到包含表单的“视图”的代码,我无法编辑它,它表示我的代码太多,无法容纳我收到的文本量。请向我发送您控制器的屏幕截图并查看我的电子邮件, vtvc17@gmail.com所以我可以帮助你们,谢谢:)我做了这两个方法,并返回从空创建默认对象value@JohnSmith2521尝试传递项目id,就像您在编辑时那样
    Route::put('/edit/{id}','ProjectController@update');问题是它找不到具有所提供id的项目。路由本身现在运行良好。这意味着您没有发送id或请求丢失。您可以在inspect elements networking标头中检查请求。@JohnSmith2521您是如何重定向到路由的?Url是否正确?@JohnSmith2521您是否也更改了路由操作?让我们看看。这不是由于未清除缓存造成的。在某些情况下,这可能会解决问题。@liamvictor我不确定这是否对您有帮助,但我感谢您的评论。我今天又遇到了这个问题,你的评论恰到好处地唤起了我的记忆。@stoi2m1I我也遇到了类似的问题,唯一的解决办法就是重新启动vagrant。没有一个artisan和composer命令没有帮助。@darko99:您找到了解决此问题的方法。我会把它作为一个答案来帮助别人更好地看到它。我认为您的解决方案可能会在评论中丢失
    
    $http({
      method: 'POST',
      url: "/managers/games/id/push",
    
    <form action="..." method="POST">
    
    @csrf  
    
    @method('PUT')
    
    
    
    </form>
    
    php artisan route:clear
    
    Route::middleware(['auth:sanctum', 'verified'])->group(function () {
        Route::prefix('projects')->group(function () {
            Route::get('', 'Projects\ProjectController@index');
            Route::get('create','Projects\ProjectController@create');
            Route::post('create','Projects\ProjectController@store');
            Route::get('show/{id}', 'Projects\ProjectController@show');
            Route::get('delete/{id}', 'Projects\ProjectController@destroy');
            Route::get('edit/{id}', 'Projects\ProjectController@edit');
            Route::put('edit/{id}','Projects\ProjectController@update');
        });
    });
    
    <?php
    namespace App\Http\Controllers\Projects;
    
    use App\Http\Requests\Project\ProjectRequest;
    use Illuminate\Http\Request;
    use App\Http\Controllers\Controller;
    
    class ProjectController extends Controller {
        //---Constructor Function
        public function __construct() {
            $this->middleware('auth:sanctum');
        }//---End of Function Constructor
    
        //---List Product
        public function index() {
        }//---End of Function index
    
        //---Create
        public function Create() {
        }//---End of Function Create
    
        //---Store
        public function Store(ProjectRequest $request) {
        }//---End of Function Store
    
        //---Show
        public function Show($project) {
        }//---End of Function Show
    
        //---Destroy
        public function Destroy($project) {
        }//---End of Function Destroy
    
        //---Edit
        public function Edit($project) {
        }//---End of Function Edit
    
        //---Update
        public function Update(ProjectRequest $request, $project) {
        }//---End of Function Update
    }
    ?>