1
votes

Laravel MethodNotAllowedHttpException sur l'action put

Je commence par laravel et essaie de faire un tutoriel mais sur une ancienne version (5.2). J'essaye donc de traduire avec la dernière version de laravel.

J'ai cette erreur sur une modification sur un formulaire:

symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException Aucun message

Mon itinéraire sur web.php

λ php artisan route:list
+--------+-----------+------------------------+------------------+------------------------------------------------------------------------+--------------+
| Domain | Method    | URI                    | Name             | Action                                                                 | Middleware   |
+--------+-----------+------------------------+------------------+------------------------------------------------------------------------+--------------+
|        | GET|HEAD  | /                      |                  | Closure                                                                | web          |
|        | GET|HEAD  | api/user               |                  | Closure                                                                | api,auth:api |
|        | POST      | centres                | centres.store    | App\Http\Controllers\CentresController@store                           | web          |
|        | GET|HEAD  | centres                | centres.index    | App\Http\Controllers\CentresController@index                           | web          |
|        | GET|HEAD  | centres/create         | centres.create   | App\Http\Controllers\CentresController@create                          | web          |
|        | PUT|PATCH | centres/{centre}       | centres.update   | App\Http\Controllers\CentresController@update                          | web          |
|        | GET|HEAD  | centres/{centre}       | centres.show     | App\Http\Controllers\CentresController@show                            | web          |
|        | DELETE    | centres/{centre}       | centres.destroy  | App\Http\Controllers\CentresController@destroy                         | web          |
|        | GET|HEAD  | centres/{centre}/edit  | centres.edit     | App\Http\Controllers\CentresController@edit                            | web          |
|        | GET|HEAD  | home                   | home             | App\Http\Controllers\HomeController@index                              | web,auth     |
|        | POST      | login                  |                  | App\Http\Controllers\Auth\LoginController@login                        | web,guest    |
|        | GET|HEAD  | login                  | login            | App\Http\Controllers\Auth\LoginController@showLoginForm                | web,guest    |
|        | POST      | logout                 | logout           | App\Http\Controllers\Auth\LoginController@logout                       | web          |
|        | POST      | password/email         | password.email   | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail  | web,guest    |
|        | GET|HEAD  | password/reset         | password.request | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web,guest    |
|        | POST      | password/reset         | password.update  | App\Http\Controllers\Auth\ResetPasswordController@reset                | web,guest    |
|        | GET|HEAD  | password/reset/{token} | password.reset   | App\Http\Controllers\Auth\ResetPasswordController@showResetForm        | web,guest    |
|        | POST      | register               |                  | App\Http\Controllers\Auth\RegisterController@register                  | web,guest    |
|        | GET|HEAD  | register               | register         | App\Http\Controllers\Auth\RegisterController@showRegistrationForm      | web,guest    |
+--------+-----------+------------------------+------------------+----------------------------------------------------

Mon contrôleur est Centrescontroller.php avec

@extends('layouts.app')

@section('content')
<h1>Editer</h1>
{!! Form::open(['url' => route('centres.update', $centres), 'method' => 'PUT' ]) !!}

    {{ method_field('PUT') }}

    {!! Form::text('titre', 'titre',  $centres->titre) !!}

    {!! Form::text('slug', 'slug',  $centres->slug) !!}

    {!! Form::textarea('description', 'description',  $centres->descriptif) !!}

    {!!Form::submit("Envoyer")!!}


{!! Form::close() !!}

@endsection

Et mon modèle avec le formulaire de modification est /views/centres/edit.balde.php avec :

<?php

namespace App\Http\Controllers;
use App\Http\Requests;
use Illuminate\Http\Request;
use App\http\Controllers\Controller;
use App\centre;

class CentresController extends Controller
{



  public function index()
  {
      $centres = Centre::get();
     return view('centres.index', compact('centres'));
  }

  public function edit($id)
  {
     $centres = Centre::find($id);
    /// dd($centres);
    return view('centres.edit', compact('centres'));
  }

  public function update($id, Request $request)
  {
      return "Utilisateur modifié !";

  }
}

J'ai essayé d'ajouter le mettre deux sections parce que j'ai trouvé beaucoup de messages avec ce problème mais cela ne résout pas le problème.

Ma liste de routes est bonne et centres.update doit être ok donc je ne comprends pas le problème:

XXX

Quelqu'un a une idée?


3 commentaires

Avez-vous essayé la liaison de modèle de formulaire? Je n'ai pas essayé d'utiliser Form :: open sur une mise à jour, mais je pense que cela pourrait avoir quelque chose à voir avec cela. Considérez ce code: {!! Form :: model ($ centres, ['method' => 'PATCH', 'route' => 'centres.update']) !!}


J'ai essayé cela et beaucoup plus de syntaxe mais impossible. J'ai toujours MethodNotAllowedHttpException


Ne modifiez pas votre solution dans votre question. Au lieu de cela, postez-le comme réponse.


3 Réponses :


0
votes

Je pense que

 {{ Form::open(['method' => 'put',  'route'=> ['centres.update', $centres], 'class'=>'form']) }}

devrait être

{!! Form::open(['url' => route('centres.update', $centres), 'method' => 'PUT' ]) !!}

Et $ centres est-ce que l'identifiant est correct? Sinon, remplacez $ centres par quelque chose comme centres-> id dans Form ( 'route' => ['centres.update', $ centres-> id ] ) c'est peut-être la raison principale.


6 commentaires

Aucun $ centre n'est l'objet principal. J'ai essayé votre solution mais même problème. Je pense que c'est un problème sur la route mais je ne comprends pas pourquoi je ne peux pas y accéder


@christophe alors pourquoi passez-vous un objet entier sous forme? Il doit s'agir simplement de id , c'est-à-dire $ centres-> id


C'était dans mon tutoriel avec la version 5.2. Il dit qu'il est possible d'envoyer un objet et que l'ID a été détecté par le framework. J'ai mis à jour avec $ centre-> id mais j'ai le même problème.


Pouvez-vous essayer de remplacer {{method_field ('PUT')}} par {!! method_field ('PUT') !!} ou @method ('PUT')


Et je pense qu'il vous manque également {{csrf_field ()}} dans le formulaire!


Une autre suggestion est de changer de méthode ici {!! Form :: open (['url' => route ('centres.update', $ centers), 'method' => 'PUT']) !!} à POST parce que vous le faites ci-dessous via {{method_field ('PUT')}}



0
votes

Mettez ceci sous la forme @csrf . Ici vous pouvez trouver plus d'informations à ce sujet https://laravel.com/docs/5.7/csrf


0 commentaires

0
votes

J'ai trouvé une solution mais je ne pense pas qu'elle soit très bonne. Si j'écris cela dans mon modèle, le formulaire est correct et je n'ai aucune erreur.

<form method="post" action="{{ route('centres.update', $centres->id) }}">


{!!  method_field('PUT') !!}
        {{ csrf_field() }}

        {!! Form::text('titre', 'titre',  $centres->titre) !!}

        {!! Form::text('slug', 'slug',  $centres->slug) !!}

        {!! Form::textarea('description', 'description',  $centres->descriptif) !!}

        {!!Form::submit("Envoyer")!!}


</form>

        @endsection

Mais je ne pense pas que ce soit une bonne solution non?


0 commentaires