2016-06-07 3 views
0

У меня есть таблица групп в моей базе данных, и у каждой группы есть слизняк. У меня есть следующие маршруты, определенные последними в файле routes.php, так что, если никакой другой URL не сопоставляется, приложение проверяет, принадлежит ли slug группе и показывает страницу группы. На странице группы также есть форма, поэтому необходимо также обработать эту форму.Как вызвать действие контроллера в Laravel и выполнить запрос проверки

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

Вот моя группа контроллер:

<?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"); 
    } 
} 

Метод вида отлично работает, однако, когда я отправить форму, я получаю следующее сообщение об ошибке:

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 

Я знаю, что это имеет отношение к делать с параметрами, передаваемыми методу контроллера из определения маршрута, и поэтому я попытался выполнить следующие действия, пытаясь его сортировать:

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

Это исправило проблему, за исключением того, что запросы просто не срабатывали. Как я могу вызвать этот метод и убедиться, что запросы запускаются так, что выполняется проверка?

ответ

1

Никогда не используйте анонимную функцию в маршрутизации, если вы собираетесь вызвать контроллер внутри него. Объявить свой маршрут, как это:

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

Затем в ручку контроллера независимо от проверки необходимо.

-1

Вы можете попробовать двигаться ваш запрос валидаций из классов Request и в частные действия контроллера:

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

Так что-то подобное с вашим кодом и вызывать эти методы проверки изнутри действие вашего контроллера:

UserController.php

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

В качестве FYI Вы можете получить доступ к параметрам маршрута по имени с помощью request()->route()->getParameter('slug')

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

Спасибо, я предполагаю, что, возможно, это сработает, поэтому мне, возможно, придется это сделать, если я не смогу найти другое решение, я предпочитаю сохранять свою проверку в запросах, хотя, если я могу, чтобы это загромождало контроллер, если я Можно. – geoffs3310

Смежные вопросы