Hallo Ich bin ziemlich neu in Laravel und versuche eine Post-Anfrage für ein einfaches Formular zu implementieren. Ich habe eine YouTube-Lernprogrammserie (laravel 5 | Section 3 | Part 4 Routing POST Requests) verfolgt, jedoch mit einer Zeit von 5: 46 Minuten. Es gibt eine Benachrichtigung, dass diese Methode nur für Versionen vor Laravel 5.2 gilt.Lavavel 5.2.36 MethodNotAllowedHttpException in RouteCollection.php Zeile 218:
Ich habe versucht, die Methode VerifyCsrfToken.php protected $ außer = ['api /']; aber das macht keinen Unterschied.
Mein routes.php Code-Schnipsel:
Route::post('/form-handler', function(\Illuminate\Http\Request $request){
if(isset($request['option']) && $request['firstName'])
{
if(strlen($request['firstName']) > 0){
return view('forms.formResults', ['action' => $request['option'], 'name' => $request['firstName']]);
}
return redirect()->back();
}
return redirect()->back(); // Return user back to the page they came from
})->name('form-handler');
Mein welcome.blade.php Code-Schnipsel:
<div class="form-group">
<form action="{{route('form-handler')}}" method="post" class="form-control">
<label for="select-action">Select an option:</label>
<select id="select-action" name="option">
<option value="option1">Option1</option>
<option value="option2">Option2</option>
<option value="option3">Option3</option>
</select>
<input type="text" name="firstName">
<button type="submit">Submit Details</button>
<input type="hidden" value="{{Session::token()}}" name="_token"> <!-- Laravel Security Measure, Note name must always be '_token'-->
</form>
</div>
Meine volle Fehlermeldung:
MethodNotAllowedHttpException in RouteCollection.php line 218:
in RouteCollection.php line 218
at RouteCollection->methodNotAllowed(array('POST')) in RouteCollection.php line 205
at RouteCollection->getRouteForMethods(object(Request), array('POST')) in RouteCollection.php line 158
at RouteCollection->match(object(Request)) in Router.php line 821
at Router->findRoute(object(Request)) in Router.php line 691
at Router->dispatchToRoute(object(Request)) in Router.php line 675
at Router->dispatch(object(Request)) in Kernel.php line 246
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 52
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in Debugbar.php line 49
at Debugbar->handle(object(Request), object(Closure))
at call_user_func_array(array(object(Debugbar), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 136
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in CheckForMaintenanceMode.php line 44
at CheckForMaintenanceMode->handle(object(Request), object(Closure))
at call_user_func_array(array(object(CheckForMaintenanceMode), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 136
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32
at Pipeline->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 102
at Pipeline->then(object(Closure)) in Kernel.php line 132
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 99
at Kernel->handle(object(Request)) in index.php line 53
Ist diese Methode der Implementierung völlig ungültig oder braucht es nur ein paar Tweeks?
Vorzugsweise würde ich gerne wissen, was die optimale Post-Methode zum Abrufen von Formulardaten ist, während Ihre Website immer noch vor Cross-Site-Request-Fälschungen zu schützen.
Alle Fixes oder alternative Lösungen werden sehr geschätzt.
Bitte zögern Sie nicht nach Ressourcen zu fragen, die ich möglicherweise weggelassen habe.
Voll routes.php (Anmerkung Ich habe auch versucht, die Post-Methode an die Middleware Route Gruppe hinzufügen):
<?php
/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the controller to call when that URI is requested.
|
*/
/* Route::get('/', function() {
return view('home.welcome');
}); */
Route::get('/', '[email protected]')->name('home');
Route::resource('lists', 'ListsController');
Route::get('/contact/{firstName?}', function($firstName = null)
{
return view('about.contact', ['firstName' => $firstName]);
})->name('contact');
Route::get('/blog', function()
{
return view('blog.blog');
})->name('blog');
Route::group(['middleware' => 'auth'], function() {
Route::post('/form-handler', function(\Illuminate\Http\Request $request){
if(isset($request['option']) && $request['firstName'])
{
if(strlen($request['firstName']) > 0){
return view('forms.formResults', ['action' => $request['option'], 'name' => $request['firstName']]); // You create the view
}
return redirect()->back();
}
return redirect()->back(); // Return user back to the page they came from
})->name('form-handler');
});
Vielen Dank für Ihre Antwort. Die Implementierung eines Controllers ist sinnvoller, da Laravel ein MVC-basiertes Framework ist. Ich bin jedoch immer noch interessiert, ob es möglich ist, dies ohne Implementierung eines Controllers zu tun. Würden Sie sagen, dass die Standardkonvention ist, immer einen Controller auch für eine statische Seite zu verwenden? – Shaun
Großartig, danke für die Ressourcen. Ich werde deinen Vorschlag versuchen. – Shaun
Persönlich bevorzuge ich einen Controller, da ich meine Analysen validieren und überwachen kann, wenn ein Benutzer auf eine Seite klickt, aber es ist nicht in Stein gemeißelt, sondern ermöglicht nur mehr Kontrolle. Um dies ohne einen Controller zu tun, können Sie einfach die Funktion auf der Route so definieren, wie Sie es getan haben. Stellen Sie sicher, dass sich der csrf-Token irgendwo in Ihrem Formular befindet. –