Laravel 5.3 路由 1 url 2 控制器中间件
Laravel 5.3 routes one url 2 controllers middleware
我正在尝试为具有相同 URI 的授权用户(中间件身份验证)和来宾(中间件来宾)使用不同的控制器,但我无法在 laravel 5.3 中使用它。
我尝试使用相同的 URI 和不同的中间件创建 2 个路由,但无法创建具有相同 URI 的 2 个路由。
我尝试了很多东西但是在 laravel 5.3 我不能在路由文件中使用 Auth::check()
,它总是 return false:
Route::get('/', [
'as' => 'home',
'uses' => (Auth::check() ? 'User\DashboardController' : 'Guest\HomeController'),
]);
我也试过在路由中使用一个函数:
Route::get('/', [
'as' => 'home',
'uses' => function (){
$app = app();
if(Auth::check()){
$controller = $app->make('App\Http\Controllers\User\DashboardController');
return $controller->callAction('getIndex', $parameters = []);
}else{
$controller = $app->make('App\Http\Controllers\Guest\HomeController');
return $controller->callAction('getIndex', $parameters = []);
}
}
]);
现在 Auth::check()
大部分工作正常,但现在控制器 __construct
函数中的中间件被忽略了。这看起来不太好。
我从登录重定向到此路由时也遇到了问题 Auth::check()
returns false。但是,如果我刷新页面,它 return 是正确的。
我不想使用 1 个控制器并在该控制器中处理用户和来宾,这是因为我的用户控制器比我的来宾控制器扩展了另一个 class。
有人知道我怎样才能有 1 条路线,其中一个控制器用于访客,另一个控制器用于授权用户?
您可以创建新的中间件:
<?php
namespace App\Http\Middleware;
use Closure;
class isGuest
{
public function handle($request, Closure $next)
{
if (! \Auth::check()) {
return redirect('/guest-page');
}
return $next($request);
}
}
然后你需要在app/Http/Kernel中注册新的中间件。php
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];
然后将其附加到所需的路由:
Route::get('user', [
'uses' => 'UsersController@index',
'as' => 'users.index'
])->middleware('isGuest');
你也可以为一个路由使用多个中间件:
Route::get('user', [
'uses' => 'UsersController@index',
'as' => 'users.index'
])->middleware('isGuest', 'secondMiddleware' ...);
这里有更多信息:https://laravel.com/docs/5.3/middleware#global-middleware
我正在尝试为具有相同 URI 的授权用户(中间件身份验证)和来宾(中间件来宾)使用不同的控制器,但我无法在 laravel 5.3 中使用它。
我尝试使用相同的 URI 和不同的中间件创建 2 个路由,但无法创建具有相同 URI 的 2 个路由。
我尝试了很多东西但是在 laravel 5.3 我不能在路由文件中使用 Auth::check()
,它总是 return false:
Route::get('/', [
'as' => 'home',
'uses' => (Auth::check() ? 'User\DashboardController' : 'Guest\HomeController'),
]);
我也试过在路由中使用一个函数:
Route::get('/', [
'as' => 'home',
'uses' => function (){
$app = app();
if(Auth::check()){
$controller = $app->make('App\Http\Controllers\User\DashboardController');
return $controller->callAction('getIndex', $parameters = []);
}else{
$controller = $app->make('App\Http\Controllers\Guest\HomeController');
return $controller->callAction('getIndex', $parameters = []);
}
}
]);
现在 Auth::check()
大部分工作正常,但现在控制器 __construct
函数中的中间件被忽略了。这看起来不太好。
我从登录重定向到此路由时也遇到了问题 Auth::check()
returns false。但是,如果我刷新页面,它 return 是正确的。
我不想使用 1 个控制器并在该控制器中处理用户和来宾,这是因为我的用户控制器比我的来宾控制器扩展了另一个 class。
有人知道我怎样才能有 1 条路线,其中一个控制器用于访客,另一个控制器用于授权用户?
您可以创建新的中间件:
<?php
namespace App\Http\Middleware;
use Closure;
class isGuest
{
public function handle($request, Closure $next)
{
if (! \Auth::check()) {
return redirect('/guest-page');
}
return $next($request);
}
}
然后你需要在app/Http/Kernel中注册新的中间件。php
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];
然后将其附加到所需的路由:
Route::get('user', [
'uses' => 'UsersController@index',
'as' => 'users.index'
])->middleware('isGuest');
你也可以为一个路由使用多个中间件:
Route::get('user', [
'uses' => 'UsersController@index',
'as' => 'users.index'
])->middleware('isGuest', 'secondMiddleware' ...);
这里有更多信息:https://laravel.com/docs/5.3/middleware#global-middleware