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 Réponses :
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.
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')}}
Mettez ceci sous la forme @csrf . Ici vous pouvez trouver plus d'informations à ce sujet https://laravel.com/docs/5.7/csrf
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?
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.