Я использую Laravel 5 и вам нужно сделать шаблон подстановочного знака, посылая пользователя на разные контроллеры на основе типа URL, вытаскиваемого из базы данных.
Мне нужно проверить URL-адрес в базе данных, а затем загрузить соответствующий контроллер / метод на основе типа slug, хранящегося в базе данных. Я борюсь с последней частью, которая отправляет пользователя на соответствующий контроллер. Ниже мой маршрут:
Route::any('{slug}', function($slug){ $url = \App\Url_slug::where('url_slug', $slug)->first(); if($url->count()){ switch($url->url_type){ case 'product': // SEND USER TO PRODUCT CONTROLLER break; case 'category': // SEND USER TO CATEGORY CONTROLLER break; case 'page': // SEND USER TO PAGE CONTROLLER break; } } else { abort(404); } });
Что мне нужно, чтобы заменить комментарии, чтобы отправить пользователя на соответствующий контроллер?
Для этого вам нужно загрузить экземпляр app()
а затем вызвать метод make('Controller')
а также callAction
. Полный маршрут ниже:
Route::any('{slug}', function($slug){ $url = \App\Url_slug::where('url_slug', $slug)->first(); if($url->count()){ $app = app(); switch($url->url_type){ case 'product': $controller = $app->make('App\Http\Controllers\ProductController'); break; case 'category': $controller = $app->make('App\Http\Controllers\CategoryController'); break; case 'page': $controller = $app->make('App\Http\Controllers\PageController'); break; } return $controller->callAction('view', ['url_slug' => $url->url_slug, 'url_slug_id' => $url->id]); } else { abort(404); } });
Вы можете просто разрешить экземпляр контроллера из контейнера службы и вызвать методы:
return app('App\Http\Controllers\ProductController')->show($product);
Это вызовет действие ProductController@show
, передаст все, что есть в $product
в качестве параметра и вернет обработанный шаблон Blade.