2017-11-17 3 views
1

Ich habe ein Formular mit zwei Textfelder und zwei Schaltflächen (bearbeiten und löschen), wenn ich die Bearbeitungsschaltfläche drücken, funktioniert es gut, aber wenn ich delete drücken, gibt es die "MethodNotAllowedHttp" Ausnahme. Mein Code ist wie folgt:Methode nicht erlaubt HTTP-Ausnahme in Laravel 5.4

<form action="/laboratory/doctors/update" method="POST"> 
    {{ csrf_field() }} 
    {{ method_field('DELETE') }} 
    <div class="form-group"> 
     <label for="name">Name:</label> 
     <input type="text" class="form-control" id="name" aria-describedby="name" value="{{ $doctor->name }}"> 
    </div> 
    <div class="form-group"> 
     <label for="percentage">Percentage:</label> 
     <input type="text" class="form-control" id="percentage" value="{{ $doctor->percentage }}"> 
    </div> 
    <button type="submit" class="btn btn-success">Save Changes</button> 
    <a href="/laboratory/doctors/{{ $doctor->id }}/delete" class="btn btn-danger">Delete</a> 
</form> 

Meine Routen sind wie folgt:

Route::post('/doctors/update', '[email protected]'); 
Route::delete('/doctors/{doctor}/delete', '[email protected]'); 

Jede Hilfe sehr geschätzt wird.

+0

Ich denke, Sie haben Formular, welche Aktion ist "Aktion ="/Labor/Ärzte/Update "Methode =" POST "' und in gleicher Form Sie haben die Methode löschen, also haben Sie die Fehler! –

Antwort

0

Href auf ein Anker-HTML-Element führt zu einem GET-Aufruf, aber Ihre Route erwartet einen Delete-Aufruf. Sie haben einige Möglichkeiten, um sicherzustellen, dass Sie einen Löschanruf erhalten.

Eine der gebräuchlichsten Methoden besteht darin, stattdessen ein Formular zu verwenden, um Daten an Ihren Server zu senden.

DELETE

{{ Form::open(['url' => '/laboratory/doctors/{{ $doctor->id }}/delete', 'method' => 'DELETE']) }} 
{{ Form::button('delete', ['type' => 'submit', 
          'class' => 'btn btn-danger']) }} 
{{ Form::close() }} 

Für beste Praxis empfehle ich nur einmal {{ Form::open(...) }}{{ Form::close() }} zu verwenden und Ihren Controller-Code Refactoring, so dass es den Wert aus den Tasten lesen kann und dass in den entsprechenden {doctor} des Lösch Beitrags übersetzen Sie haben also nicht mehrere HTML-Formulare in Ihrem Code.

1

Sie haben die Route der http-Verben als delete Typ erstellt und versucht, von Typ get zu erhalten. So können Sie es als get ändern statt delete

Route::get('/laboratory/doctors/{doctor}/delete', '[email protected]'); 

Auch gibt andere Art und Weise ist http Verb als DELETE aber mit

  1. Einen weiteren form Tag außerhalb des aktuellen form Tages zu machen.
  2. oder benutzen Ajax, um es delete Typ
+0

Kann OP sein "/ Labor" als Präfix in Route nehmen! –

+0

@HirenGohel: Ja danke – C2486

+1

@HirenGohel: Ich habe meine Antwort aktualisiert – C2486

0
@if(isset($doctor)) 
<form action="/laboratory/doctors/{{$doctor->id}}/delete" method="POST"> 
@else 
<form action="/laboratory/doctors/update" method="POST"> 
@endif 
    {{ csrf_field() }} 
    @if(isset($doctor)) 
    {{ method_field('DELETE') }} 
    @endif 
    <div class="form-group"> 
     <label for="name">Name:</label> 
     <input type="text" class="form-control" id="name" aria-describedby="name" value="{{ $doctor->name }}"> 
    </div> 
    <div class="form-group"> 
     <label for="percentage">Percentage:</label> 
     <input type="text" class="form-control" id="percentage" value="{{ $doctor->percentage }}"> 
    </div> 
    <button type="submit" class="btn btn-success">Save Changes</button> 
    <a href="/laboratory/doctors/{{ $doctor->id }}/delete" class="btn btn-danger">Delete</a> 
</form> 

Das Problem in Ihrer Aktion ist .. wenn Sie Schaltfläche Löschen klicken, wird der Button die Funktion zerstören laufen, aber die Form die Update-Funktion ausführen. Also, Sie müssen die Formularaktion trennen, oder Sie können es löschen, indem Sie Ajax