2016-06-07 5 views
0

Ich habe eine Gruppentabelle in meiner Datenbank und jede Gruppe hat einen Slug. Ich habe die folgenden Routen zuletzt in meiner routes.php-Datei definiert, so dass, wenn keine andere URL gefunden wird, die App überprüft, ob der Slug zu einer Gruppe gehört und stattdessen die Gruppenseite anzeigt. Es gibt auch ein Formular auf der Gruppenseite, so dass die Einreichung dieses Formulars ebenfalls behandelt werden muss.So rufen Sie die Controller-Aktion in Laravel auf und führen eine Validierungsanfrage aus

Route::get('{slug}', ['as' => 'dynamic_route', function($slug){ 
    $group = \App\Group::where('slug', $slug)->first(); 
    if(!is_null($group)) { 
     $app = app(); 
     $controller = $app->make('App\Http\Controllers\GroupsController'); 
     return $controller->callAction('view', ['slug' => $group->slug]); 
    } else { 
     abort(404); 
    } 
}]); 

Route::post('{slug}', ['as' => 'dynamic_route_submit', function($slug){ 
    $group = \App\Group::where('slug', $slug)->first(); 
    if(!is_null($group)) { 
     $app = app(); 
     $controller = $app->make('App\Http\Controllers\GroupsController'); 
     return $controller->callAction('handle_register', [$group->slug]); 
    } else { 
     abort(404); 
    } 
}]); 

Hier ist meine Gruppen-Controller:

<?php namespace App\Http\Controllers; 
use View; 
use App\Group; 
use App\Lifestyle_question; 
use App\Http\Requests\User\RegisterStep1Request; 
use App\Http\Requests\User\RegisterStep2Request; 
use Breadcrumbs; 

class GroupsController extends FrontendController { 

    public function __construct() 
    { 
     parent::__construct(); 
    } 

    function view($slug) 
    { 
     $this->data['group'] = Group::where('slug', '=', $slug)->first(); 

     $this->data['lifestyle_questions'] = Lifestyle_question::all(); 

     Breadcrumbs::setCurrentRoute('dynamic_route', $this->data['group']); 

     return View::make('groups/view', $this->data); 
    } 

    function handle_register(RegisterStep1Request $request1, RegisterStep2Request $request2, $slug) 
    { 
     $this->data['group'] = Group::where('slug', '=', $slug)->first(); 

     die("Validation passed"); 
    } 
} 

Die Ansicht Methode funktioniert jedoch gut, wenn ich die Form ich die folgende Fehlermeldung einreichen:

ErrorException in GroupsController.php line 27: 
Argument 1 passed to App\Http\Controllers\GroupsController::handle_register() must be an instance of App\Http\Requests\User\RegisterStep1Request, string given 

weiß ich, das muss mache ich mit den Parametern, die von der Routendefinition an die Controller-Methode übergeben werden, und versuchte daher folgendes, um sie zu sortieren:

Route::post('{slug}', ['as' => 'dynamic_route_submit', function($slug){ 
    $group = \App\Group::where('slug', $slug)->first(); 
    if(!is_null($group)) { 
     $app = app(); 
     $controller = $app->make('App\Http\Controllers\GroupsController'); 
     return $controller->callAction('handle_register', [new \App\Http\Requests\User\RegisterStep1Request, new \App\Http\Requests\User\RegisterStep2Request, $group->slug]); 
    } else { 
     abort(404); 
    } 
}]); 

Dies behebt das Problem, außer die Anfragen wurden nicht ausgelöst. Wie kann ich diese Methode aufrufen und sicherstellen, dass die Anforderungen ausgelöst werden, damit die Validierung ausgeführt wird?

Antwort

1

nie eine anonyme Funktion in der Routing verwenden, wenn Sie einen Controller nennen in der es gehen mit. Erklären Sie Ihre Route wie folgt aus:

Route::post('{slug}', ['as' => 'dynamic_route_submit', 'uses' => 'App\Http\Controllers\[email protected]_register']);

Dann in der Steuerung Griff, was die Validierung erforderlich ist.

-1

Sie könnten versuchen, Ihre Anfrage Validierungen aus den Antrag Klassen und in private Controller-Aktionen zu bewegen:

UserController.php

/** 
* Validates a Create User request 
*/ 
protected function validateCreate() 
{ 
    $this->validate($this->request, [ 
     'name'    => 'required|max:255', 
     'email'    => 'required|unique:users|max:255', 
     'account_types_id' => 'required|numeric', 
    ]); 
} 

So etwas Ähnliches tun mit Ihrem Code und nennen diese Validierungsmethoden aus Ihre Controlleraktion:

UserController.php

/** 
* @return \Illuminate\Http\RedirectResponse 
* @throws CreateException 
*/ 
public function create() 
{ 
    $this->validateCreate(); 

als FYI können Sie Routenparameter zugreifen namentlich request()->route()->getParameter('slug')

$slug = request()->route()->getParameter('slug'); 
$this->data['group'] = Group::where('slug', '=', $slug)->first(); 
+1

Danke, ich nehme an, dass wahrscheinlich funktionieren würde, also muss ich es vielleicht so machen, wenn ich keine andere Lösung finden kann. Ich bevorzuge es, meine Validierung in Anfragen zu halten, wenn ich eher den Controller überladen kann kann. – geoffs3310

Verwandte Themen