Laravel 单个路由指向不同的控制器,具体取决于 slugs
Laravel single route point to different controller depending on slugs
我是 laravel 的新手,我搜索了很多问题的答案,但要么不适用,要么我没找到。
我有一个 FileMaker 解决方案供客户处理客户和事件。我客户的每个客户都有自己的活动网站,这些网站通过该解决方案进行管理。简单的一个cms。每个客户都会得到一个带有 url 类似客户站点的站点。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
});
});
有许多页面类型(标准 text/image、特殊形式等),因此我想介绍不同的控制器。
活动名称始终是唯一的,但页面不是。
您可以在路由闭包内手动调用控制器。尽管我建议在辅助文件中进行验证以使路由文件清晰易读。
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());
}
});
});
路由解决方案的替代方案可能是在控制器本身中处理逻辑:
首先,将 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');
}
此解决方案可让您的路由文件保持清洁,还可以让您处理不同的事件和页面数据,并根据正在查看的页面加载不同的视图。你的额外逻辑在控制器而不是路由文件中会更好。
这完全取决于您喜欢在哪里编写页面/视图逻辑代码。您可以在同一控制器或外部控制器中使用此方法调用函数。
我是 laravel 的新手,我搜索了很多问题的答案,但要么不适用,要么我没找到。
我有一个 FileMaker 解决方案供客户处理客户和事件。我客户的每个客户都有自己的活动网站,这些网站通过该解决方案进行管理。简单的一个cms。每个客户都会得到一个带有 url 类似客户站点的站点。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
});
});
有许多页面类型(标准 text/image、特殊形式等),因此我想介绍不同的控制器。
活动名称始终是唯一的,但页面不是。
您可以在路由闭包内手动调用控制器。尽管我建议在辅助文件中进行验证以使路由文件清晰易读。
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());
}
});
});
路由解决方案的替代方案可能是在控制器本身中处理逻辑:
首先,将 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');
}
此解决方案可让您的路由文件保持清洁,还可以让您处理不同的事件和页面数据,并根据正在查看的页面加载不同的视图。你的额外逻辑在控制器而不是路由文件中会更好。
这完全取决于您喜欢在哪里编写页面/视图逻辑代码。您可以在同一控制器或外部控制器中使用此方法调用函数。