Laravel单一路线指向不同的控制器,取决于slu ..

时间:2016-03-24 14:46:44

标签: php laravel-5 laravel-5.1 filemaker

我是laravel的新手,我已经搜索了很多我的问题的答案但是它不适用或者我没有得到它。

我有一个处理客户和事件的客户端的FileMaker解决方案。我的客户的每个客户都有自己的活动网站,通过该解决方案进行管理。简单来说就是cms。每个客户都会获得一个网站,其网址为clientsite.com/event。

事件中的每个页面都有一个页面类型,我想根据类型寻址不同的控制器。

在routes.php中我有:

Route::group(['middleware' => ['sal', 'menu']], function () {

    Route::get('/{event}/{page}', function($event, $page) {
        // Query page for page-type and use controller depending on type
    });
});

有很多页面类型(标准文本/图像,专用表格等),因此我想解决不同的控制器。

事件名称始终是唯一的,但页面不是。

2 个答案:

答案 0 :(得分:0)

您可以在路由闭包内手动调用控制器。虽然我建议在帮助文件中进行验证,以使路径文件清晰可读。

Route::group(['middleware' => ['sal', 'menu']], function () {

    Route::get('/{event}/{page}', function($event, $page) {
        // you could do something like
        $user_type = Auth::user()->user_type;
        if($user_type == "organizer")
        {   

            $controller = $app->make('OrganizerController');  
            return $controller->callAction('controllerFunc', $parameters = array());          
        }
        else
        {
           $controller = $app->make('ClientController');  
           return $controller->callAction('controllerFunc', $parameters = array());          
        }        

    });
});

答案 1 :(得分:0)

路由解决方案的替代方案可以是处理控制器本身的逻辑:

首先,将routes.php更新为:

Route::group(['middleware' => ['sal', 'menu']], function () {
    Route::get('/{event}/{page}', 'RoutesController@index');
});

然后,在RoutesController.php文件中(添加到app/Http/Controllers),你可以做类似的事情:

public function index()
{
    $event = Request::segment(1); // get the {event} part of the route
    $page = Request::segment(2); // get the {page} part of the route

    // get event data from database, e.g.
    $event_data = Event::where( 'slug', $event )->first();

    // load correct page
    switch ( $page ) {
        case "people":
            return $this->people();
        break;
        case "anotherPage":
            return $this->another_page();
        break;
    }
}

private function people()
{
    // show view
    return View::make('event.people');
}

此解决方案可使路由文件保持干净,但也可让您处理不同的事件和页面数据,并根据所查看的页面加载不同的视图。你的额外逻辑在控制器而不是路径文件中会更好。

这完全取决于您希望对页面/视图逻辑进行编码的位置。您可以在同一个控制器或外部控制器中使用此方法调用函数。