2016-05-03 3 views
0

Ich habe this Beitrag gesehen, aber ich glaube nicht, dass es relevant für mein Problem ist, weil ich glaube, dass ich Postdaten über eine Post-Route korrekt weiterleiten.Laravel: Die Weitergabe von Daten über einen Controller führt zu MethodNotAllowedHttpException

Hier ist der relevante Route Code:

Route::get('/pass', '[email protected]'); 
Route::post('/pass/{request}',['uses' => '[email protected]']); 

Ich mag würde ein Controller-Methode für die ‚pass‘ Seite haben, aber die Frage, die ich ihnen getrennt sind, zu isolieren.

Hier sind die Verfahren in PageController.php:

public function pass(){ 

    return view('pass')->with(array(
     'title'=>'Create A Pass' 
    )); 



} 
public function passRequest($request){ 
    $data['request'] = $request; 
    $validator = Validator::make($request->all(), [ 
     'studentID' => 'required|max:255', 
     'teacherID' => 'required|max:255', 
     'destination' => 'required|max:255', 
    ]); 
    if ($validator->fails()) { 
     return redirect('/') 
      ->withInput() 
      ->withErrors($validator); 
    } 
    $pass = new Pass; 
    $pass->student = DB::table('users')->where('studentID', $request->studentID)->first()->id; 
    $pass->teacher = DB::table('users')->where('teacherID', $request->teacherID)->first()->id; 
    $pass->destination = $request->destination; 
    $pass->save(); 
    return view('home')->with(array(
     'title'=>'Home', 
     'success'=>'null' 
    )); 
} 

I verwendeten Verfahren, um here angegebenen Daten an die Steuerung zu übergeben. Wenn das schlecht ist/veraltet, bin ich offen für irgendwelche Vorschläge.

Dies ist das Formular auf der Seite ‚Pass‘ für

<form action="{{ url('pass') }}" method="POST" class="form-horizontal"> 

     {!! csrf_field() !!} 
     <fieldset> 
      <!-- Text input--> 
      <div class="container"> 
       <div class="form-group"> 
        <label class="col-md-4 control-label" for="studentID">Student ID</label> 
        <div class="col-md-3"> 
         <input id="studentID" name="studentID" type="text" class="form-control input-md"> 
        </div> 
       </div> 
      </div> 
      <!-- Text input--> 
      <div class="container"> 
       <div class="form-group"> 
        <label class="col-md-4 control-label" for="teacherID">Teacher ID</label> 
        <div class="col-md-3"> 
         <input id="teacherID" name="teacherID" type="text" class="form-control input-md"> 
        </div> 
       </div> 
      </div> 
      <!-- Text input--> 
      <div class="container"> 
       <div class="form-group"> 
        <label class="col-md-4 control-label" for="destination">Destination</label> 
        <div class="col-md-3"> 
         <input id="destination" name="destination" type="text" class="form-control input-md"> 
        </div> 
       </div> 
      </div> 
      <div class="container"> 
       <div class="form-group"> 
        <div class="col-sm-offset-4 col-sm-6"> 
         <button type="submit" class="btn btn-default"> 
          <i class="fa fa-check"></i> Create Pass 
         </button> 
        </div> 
       </div> 
      </div> 
     </fieldset> 
</form> 

Bei Vorlage dieses Formulars die Post-Daten zu senden ich die MethodNotAllowedHttpException Ausnahme erhalten.

Wenn ein Stack-Trace des Fehlers hilfreich sein würde, lassen Sie mich bitte wissen. Wenn es irgendwelche Stilvorschläge gibt, bin ich auch dafür offen.

Antwort

2

Dieses Formular-Tag wird eine POST-Anfrage an die URL generieren /pass:

<form action="{{ url('pass') }}" method="POST" class="form-horizontal"> 

Ihre Routen-Datei nicht zulässt. Es erlaubt nur GET-Anfragen an diese URL, aber POST Anfragen an /pass/{request}.

Nicht sicher, ob es sich nur um einen Fehler beim Kopieren/Einfügen handelt, aber Ihre POST-Route ist so eingerichtet, dass sie die Methode [email protected] aufruft. Die von Ihrem Controller freigegebene Methode heißt passRequest. Diese müssen auch übereinstimmen.

+0

Vielen Dank für die Antwort. Ich glaube, ich beginne den gesamten Routing-Prozess zu verstehen. Ich habe es versäumt, die Methoden get und {request} zu verbinden. Anstatt zu verstehen, was ich tat, war ich einfach Code kopieren und einfügen und es zu diesem Zweck verwenden. Ich kann nicht sagen, dass es noch funktioniert, zumindest wurde dieses Problem gelöst. – Damen

2

Zusätzlich zu dem, was Jeff Lambert wies darauf hin, sollten Sie setzen die {request} Variable in der Route nicht.

Sie sollten, dass entfernen und haben Laravel für Sie das Request Objekt zu injizieren.

Import der Request Klasse, wenn Sie nicht bereits an der Spitze der Klasse.

use Illuminate\Http\Request; 

Und Ihre Funktion sollte wie folgt aussehen ...

public function passRequest(Request $request) 
{ 
    ... 
} 

Wenn Sie weitere Parameter über die URL übergeben, dann können Sie sie auf die Route hinzufügen, und fügen Sie die Argumente die Methode nach Request $request. Laravel wird herausfinden, was damit zu tun ist.

+0

Diese Antwort hat mir wirklich geholfen, den Grund für diese {request} Variable in der URL der Route zu verbinden.Natürlich ist es nur für get, denn hier bekommen Antworten zu gehen. Ich habe immer noch ein paar Probleme in meinem Code ausgearbeitet, aber das hat mir wirklich geholfen, die Punkte zu verbinden. Vielen Dank! – Damen

Verwandte Themen