2016-06-29 6 views
0

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'); 
}); 

Antwort

0

Edited Antwort -

ich meine Antwort bearbeitet haben saubereren Code zu machen, die hat genau was du brauchst. Anstatt isset zu verwenden, wird eine Validierung verwendet, die den Code nicht beendet, wenn die Optionen nicht festgelegt sind. Dies wird auch eine Fehlermeldung in der Blade-Ansicht anzeigen.

Ihre routes.php Datei sollte folgende Komponenten enthalten

Route::post('/form-handler', '[email protected]'); 

Der Blade Ansicht muss eine Form haben, die

wie diese

@if (count($errors) > 0) 
    <div class="alert alert-danger"> 
     <ul> 
      @foreach ($errors->all() as $error) 
       <li>{{ $error }}</li> 
      @endforeach 
     </ul> 
    </div> 
@endif 
<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"> 
     <input type="hidden" name="_token" value="<?php echo csrf_token(); ?>"> 
     <button type="submit">Submit Details</button> 
     <input type="hidden" value="{{Session::token()}}" name="_token"> 
    </form> 

Die Form Controller sieht

<?php 

namespace App\Http\Controllers; 

use Illuminate\Http\Request; 
use Illuminate\Routing\Controller; 

class FormController extends Controller 
{ 
    /** 
    * Logic Goes here. 
    * 
    * @param Request $request 
    * @return Response 
    */ 
    public function formHandle(Request $request) 
    { 
     $this->validate($request, [ 
      'firstName' => 'required|min:1|max:255', 
      'option' => 'required' 
      ]); 

      $data = $request; 

      return view('forms.formResults')->compact($data); 
    } 
} 
wie folgt aussehen muss
+0

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

+0

Großartig, danke für die Ressourcen. Ich werde deinen Vorschlag versuchen. – Shaun

+0

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. –

Verwandte Themen