2015-07-23 8 views
6

Ich habe eine Route Ressource Route::resource('projects', 'ProjectsController'); und wenn ich route:list laufen sehe ich POST ist verfügbar.Laravel 5: kann nicht POST Ressource Ressource zu leiten

+--------+----------+--------------------------+------------------+--------------------------------------------------------------+-----------------+ 
| Domain | Method | URI      | Name    | Action              | Middleware  | 
+--------+----------+--------------------------+------------------+--------------------------------------------------------------+-----------------+ 
|  | GET|HEAD | projects     | projects.index | App\Http\Controllers\[email protected]    | auth   | 
|  | POST  | projects     | projects.store | App\Http\Controllers\[email protected]    | auth   | 
|  | GET|HEAD | projects/create   | projects.create | App\Http\Controllers\[email protected]    | auth   | 
|  | GET|HEAD | projects/{projects}  | projects.show | App\Http\Controllers\[email protected]     | auth   | 
|  | PUT  | projects/{projects}  | projects.update | App\Http\Controllers\[email protected]    | auth   | 
|  | PATCH | projects/{projects}  |     | App\Http\Controllers\[email protected]    | auth   | 
|  | DELETE | projects/{projects}  | projects.destroy | App\Http\Controllers\[email protected]    | auth   | 
|  | GET|HEAD | projects/{projects}/edit | projects.edit | App\Http\Controllers\[email protected]     | auth   | 
+--------+----------+--------------------------+------------------+--------------------------------------------------------------+-----------------+ 

Wenn ich /projects/create bin (zeigt meine Form) und traf meine Submit-Button, erhalte ich eine Fehlermeldung, dass:

MethodNotAllowedHttpException in RouteCollection.php line 201: 
    at RouteCollection->methodNotAllowed(array('GET', 'HEAD', 'PUT', 'PATCH', 'DELETE')) in RouteCollection.php line 188 

Ist es vielleicht, wie ich meine <form> Tag bin definieren? Benutze ich nicht die richtige Aktion?

<form method="post" action="">

Ich habe auch versucht <form method="post" action="{{ url('projects/store') }}">

Sorry, ich bin ein noob Laravel!

+0

Wer hat gewählt, um meine Frage zu schließen, weil es off Thema ist, erklären Sie bitte – Ronnie

+0

Ihre Routen spezifizieren nur 'GET' und' HEAD' Methoden wie erlaubt für '/ projects/create', aber Sie verwenden eine' POST' Methode zu übermitteln deine Form. Passen Sie Ihre Routes-Datei an, um auch 'POST' zu akzeptieren. – brezanac

+0

Das verstehe ich jetzt, danke. @Zerp wies darauf hin, dass meine Aktion einfach auf '/ projects' zeigen musste, damit ich – Ronnie

Antwort

7

Sie sollten POST in die Ressource URL, nicht Ressource/erstellen.

Mit anderen Worten nur sicherstellen, dass die Aktion des Formulars action="/projects" ist nicht action="/projects/create"

Edit: Ich werde das hier lassen, wie es Art relevant ist, und weil ich es ursprünglich geschrieben, aber mit dem forewarning, dass Es ist Overkill und eine Menge irrelevanter Code für jemanden, der gerade anfängt.

Zum Beispiel, hier ist ein Blade-Schnipsel aus einer meiner Seiten:

@extends('layouts.master') 

@section('title', 'Create a Project') 

@section('content') 

    <h3>Create a Project</h3> 

    <hr/> 

    {!! Form::open(['action'=>'[email protected]']) !!} 

     @include('forms/partials/edit_form', ['submit_button_label' => 'Add Project']) 

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


    @include('errors.list') 

@endsection 
+0

Ah, das war's! Ich sollte wahrscheinlich beginnen, meine Formulare so zu erstellen, anstatt HTML. Danke @Zerp. Ich werde deine Antwort in 5 Minuten annehmen. – Ronnie

+0

Danke. Ich würde die "Laravel 5 Fundamentals" -Serie auf laracasts.com empfehlen, wenn Sie mehr erfahren möchten. – Zerp

+0

Ich beobachtete sie alle vor ein paar Monaten, als ich ein paar Ausfallzeiten hatte. Ich benutze L5 tatsächlich in einem echten Projekt, also sollte ich vielleicht nach einer Auffrischung Ausschau halten. – Ronnie

3

Laravel tatsächlich verwendet method="POST" in allen <form> Tags.

Was Sie brauchen, ist die folgende:

<input type="hidden" name="_method" value="DELETE"> 

DELETE kann auch mit den anderen HTTP-Verben ersetzt werden (PUT, PATCH, UPDATE usw.)

+0

Oder Sie könnten die Form Helfer verwenden und es tut alles für Sie. – Kyle

+0

Können Sie näher erläutern, warum ich ein DELETE benötigen würde, wenn ich etwas in der DB speichern möchte? – Ronnie

+0

Sie nicht. Nur ein Beispiel für Syntax. Ich dachte, du hättest verwirrt sein können, wie man die Methode einstellt. Die Frage erneut lesen Ich denke, diese Antwort ist ziemlich sinnlos. – Kyle

0

Ich sehe, dass seit der letzten Antwort Laravel hat wurde aktualisiert. Jedenfalls bin ich heute auf dasselbe Problem gestoßen und hier habe ich es behoben.

Grundsätzlich mein Routing wie folgt aussieht jetzt:

// 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\[email protected]'); 
Route::post('admin/photos/create', 'Admin\[email protected]'); 

Hoffnung, dass jemand hilft.

Verwandte Themen