Laravel 5.2
当用户进入您的登录页面时,您必须存储之前的 URL:
https://laravel.com/docs/5.2/helpers#method-url
会话是一个选项:https://laravel.com/docs/5.2/helpers#method-session
之后,您应该在用户尝试登录时使用该信息填充 $redirectTo:https://laravel.com/docs/5.2/authentication#included-authenticating
我用中间件写了一个例子。
首先你需要创建一个:
php artisan make:middleware BeforeLoginForm
现在我们需要覆盖 Auth\AuthController@showLoginForm 的默认路由,因此我们可以将中间件添加到该路由:
app/Http/routes.php
Route::auth();
$this->get('login', 'Auth\AuthController@showLoginForm')
->middleware('before.loginform');
为我们的中间件定义一个别名:
app/Http/Kernel.php
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'before.loginform' => \App\Http\Middleware\BeforeLoginForm::class,
];
我们的中间件将使用会话助手存储之前的 URL:
app/Http/Middleware/BeforeLoginForm.php
namespace App\Http\Middleware;
use Closure;
class BeforeLoginForm
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
session()->put('before_login_url', url()->previous());
return $next($request);
}
}
AuthController 的构造函数将使用我们之前存储的 URL 更改 redirectTo 属性:
app/Http/Controllers/Auth/AuthController.php
<?php
namespace App\Http\Controllers\Auth;
class AuthController extends Controller
{
/**
* Where to redirect users after login / registration.
*
* @var string
*/
protected $redirectTo = '/';
/**
* Create a new authentication controller instance.
*
* @return void
*/
public function __construct()
{
$redirectTo = session()->get('before_login_url');
if (!empty($redirectTo)) {
$this->redirectTo = $redirectTo;
}
$this->middleware($this->guestMiddleware(), ['except' => 'logout']);
}
对于 Laravel 5.0(只有不同之处)
你应该像这样注册你的路线:
app/Http/routes.php
Route::get('/', 'WelcomeController@index');
Route::get('home', 'HomeController@index');
Route::controllers([
'auth' => 'Auth\AuthController',
'password' => 'Auth\PasswordController',
]);
Route::get('auth/login', [
'middleware' => 'before.loginform',
'uses' => 'Auth\AuthController@getLogin'
]);
然后在你的 AuthController 上修改 redirectTo:
app/Http/Controllers/Auth/AuthController.php
public function __construct(Guard $auth, Registrar $registrar)
{
$this->auth = $auth;
$this->registrar = $registrar;
$redirectTo = session()->get('before_login_url');
if (!empty($redirectTo)) {
$this->redirectTo = $redirectTo;
}
$this->middleware('guest', ['except' => 'getLogout']);
}
我无法测试,稍后再做。
注意,因为“redirectTo”属性的值不仅会影响身份验证,还会影响注册过程。