我如何做变量/通配符路由在Laravel


How can I do variable/wildcard routes in Laravel?

我正在使用Laravel 5,需要做一个通配符路由,根据URL类型将用户发送到不同的控制器,从数据库中拉入。

我需要检查数据库中的URL段塞,然后根据段塞类型加载相关的控制器/方法,保存在数据库中。我正在努力与最后一部分,这是发送用户到相关的控制器。下面是我的路线:

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中的任何内容作为参数,并返回渲染的刀片模板。