如何在Laravel中执行变量/通配符路由?

时间:2015-07-30 10:49:24

标签: php laravel-5 laravel-routing

我正在使用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);
    }
});

为了将用户发送到相关控制器,我需要更换注释?

2 个答案:

答案 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模板。