2015-07-23 16 views
6

Mam zasób trasy Route::resource('projects', 'ProjectsController');, a po uruchomieniu route:list widzę, że POST jest dostępny.Laravel 5: Nie mogę POST wysłać do zasobu

+--------+----------+--------------------------+------------------+--------------------------------------------------------------+-----------------+ 
| 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   | 
+--------+----------+--------------------------+------------------+--------------------------------------------------------------+-----------------+ 

Kiedy jestem w /projects/create (pokazuje moją postać) i uderzyłam przycisk Prześlij, pojawia się błąd mówiąc:

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

Czy to być może, jak ja definiowania moje <form> tag? Czy nie używam właściwej akcji?

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

Próbowałem też <form method="post" action="{{ url('projects/store') }}">

Niestety, jestem noobem do laravel!

+0

Ktokolwiek zagłosował na zamknięcie mojego pytania, ponieważ nie jest to temat, proszę wyjaśnić – Ronnie

+0

Twoje trasy określają tylko metody 'GET' i' HEAD' jako dozwolone dla '/ projects/create', ale używasz metody' POST' do przesłania Twoja forma. Dostosuj plik tras, aby zaakceptować również "POST". – brezanac

+0

Rozumiem to teraz, dzięki. @Zerp zwrócił uwagę, że moje działanie musi wskazywać na proste '/ projects', aby móc przechowywać – Ronnie

Odpowiedz

7

Powinieneś być POST w adresie URL zasobu, a nie w zasobie/tworzyć.

Innymi słowy po prostu upewnij się, że akcja formularza jest action="/projects" nie action="/projects/create"

Edit: zostawię to tutaj, ponieważ jest to rodzaj istotne, i dlatego, że pierwotnie wysłane, ale z forewarning że jest to przesada i dużo nieistotnego kodu dla kogoś, kto dopiero zaczyna.

Na przykład, oto fragment ostrza z jednego z moich stron:

@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

Ach, udało się! Prawdopodobnie powinienem zacząć tworzyć moje formularze w ten sposób, a nie HTML. Dziękuję @Zerp. Przyjmuję ci odpowiedź w 5 minut. – Ronnie

+0

Dzięki. Polecam serię "Laravel 5 Fundamentals" na laracasts.com, jeśli chcesz dowiedzieć się więcej. – Zerp

+0

Właściwie oglądałem je wszystkie kilka miesięcy temu, kiedy miałem trochę czasu. Obecnie używam L5 w prawdziwym projekcie, więc może powinienem poszukać czegoś odświeżającego. – Ronnie

3

laravel faktycznie korzysta method="POST" we wszystkich <form> tagów.

Co trzeba jest następujący:

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

DELETE można zastąpić innymi czasowników HTTP też (PUT, patch, UPDATE, etc)

+0

Albo możesz użyć pomocników formularzy i wszystko to zrobi dla ciebie. – Kyle

+0

Czy możesz wyjaśnić, dlaczego potrzebuję DELETE, jeśli chcę przechowywać coś w DB? – Ronnie

+0

Ty nie. Tylko przykład składni. Pomyślałem, że możesz nie wiedzieć, jak ustawić tę metodę. Ponowne przeczytanie pytania Myślę, że ta odpowiedź jest raczej bezcelowa. – Kyle

0

widzę, że od ostatniej odpowiedzi laravel ma został zaktualizowany. W każdym razie, spotkałem się z tym samym problemem dzisiaj i oto jak to naprawiłem.

Zasadniczo mój routingu wygląda to teraz:

// 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]'); 

nadzieję, że ktoś pomoże.