我正在使用Laravel 4.1构建应用程序。我的应用需要有两种不同的用户,管理员和客户端。为此,我在用户表中添加了一个类型列,并在/app/filters.php中创建了海关过滤器。
Route::filter('admin', function()
{
if (Auth::guest() || Auth::user()->type !== 1) return Redirect::to('/');
});
Route::filter('client', function()
{
if (Auth::guest() || Auth::user()->type != 2) return Redirect::to('/');
});
然后我在/app/routes.php
中创建了Route :: group/* Admin */
Route::group(array('before' => 'admin'), function()
{
Route::get('admin', function(){ return "admin index"; });
Route::get('ejemplo', function(){ return "admin ejmplo"; });
});
/* Client */
Route::group(array('before' => 'client'), function()
{
Route::get('client', function(){ return "client index"; });
Route::get('ejemplo', function(){ return "client ejmplo"; });
});
我面临的问题是我无法访问Route :: get('ejemplo'),我想到了解决方案:
但是因为我对laravel很陌生,所以我不想弄乱我的代码,使其无法扩展或不可维护。
我对任何其他解决方案或结构设计持开放态度,
非常感谢您提前。 干杯
答案 0 :(得分:0)
请勿重新定义具有相同名称的路线。路由设计为指向一个位置,过滤器旨在过滤对路由的访问,拒绝不符合条件的客户端(不是authed,错误的csrf令牌,没有足够的权限等)。
我会问你自己是否真的需要你的示例路由指向两个不同的地方,具体取决于用户输入,根据我的经验到目前为止答案可能没有。
您是否考虑过像
这样的内容Route::group( array( 'prefix' => 'admin', 'before' => 'admin' ) function() {
Route::get( 'admin', function() { return "admin index"; } );
Route::get( 'example', function() { return "admin example"; } );
});
Route::group( array( 'prefix' => 'client', 'before' => 'client' ), function() {
Route::get( 'client', function() { return "client index"; } );
Route::get( 'example', function() { return "client example"; } );
});
然后你通过
导航到那个example.co.uk/admin/example
example.co.uk/client/example
如果这对您不起作用,并且您确实需要指向不同位置的路线,那么我要考虑的两个选项是
控制器示例:
function MyControllerFunction() {
$user = Auth::user();
if ( is_null( $user ) ) {
HandleUserNotAuthed();
}
if( Auth::user()->isAdmin ) {
HandleAdminCodeHere();
} else {
HandleClientCodeHere();
}
}
路线示例:
$user = Auth::user();
if( ! ( is_null( $user ) ) ) {
if( $user->isAdmin ) {
Route::get( 'admin', function() { return "admin index"; } );
Route::get( 'example', function() { return "admin example"; } );
} else {
Route::get( 'client', function() { return "client index"; } );
Route::get( 'example', function() { return "client example"; } );
}
}
正如您所知,最后两个示例非常混乱,除非您必须拥有相同的URL,否则我不会推荐它。查看您的应用程序并确定您是否可以使用不同的路由,如果可以,请执行此操作(:
答案 1 :(得分:0)
Laravel save是将url作为唯一索引的路由。这意味着除非您使用if/else
,否则您不能拥有两条具有相同网址的路由。
我建议您创建另一个过滤器,检查用户是管理员还是客户端,然后将共享Route
添加到新组中。
过滤器强>
Route::filter('admin', function()
{
if (Auth::guest() || Auth::user()->type !== 1) return Redirect::to('/');
});
Route::filter('client', function()
{
if (Auth::guest() || Auth::user()->type != 2) return Redirect::to('/');
});
Route::filter('admin_or_client', function()
{
if (Auth::guest() || ! in_array(Auth::user()->type, [1, 2])) return Redirect::to('/');
});
<强>路线强>
/* Admin */
Route::group(array('before' => 'admin'), function()
{
Route::get('admin', function(){ return "admin index"; });
});
/* Client */
Route::group(array('before' => 'client'), function()
{
Route::get('client', function(){ return "client index"; })
});
/* Admin or Client */
Route::group(array('before' => 'admin_or_client'), function()
{
Route::get('ejemplo', function(){ return "admin or client ejmplo"; });
});