我正在使用Laravel 5,需要做一个通配符路由,根据URL类型将用户发送到不同的控制器,从数据库中提取。
我需要检查数据库中的URL slug,然后根据数据库中保存的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);
}
});
为了将用户发送到相关控制器,我需要更换注释?
答案 0 :(得分:2)
为此,您需要加载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);
}
});
答案 1 :(得分:1)
您可以简单地从服务容器中解析控制器实例,并在其上调用方法:
return app('App\Http\Controllers\ProductController')->show($product);
这将调用ProductController@show
操作,将$product
中的任何内容作为参数传递,并返回呈现的Blade模板。