Laravel 5.7:未注册用户跳转登录后获取原URL的email参数
在Laravel 5.7登录页获取原请求的email参数
没问题,这个需求在Laravel 5.7里可以通过解析session中存储的意图URL来实现,下面给你两种简单的实现方式:
方法一:直接在登录视图中解析参数
Laravel默认会把用户尝试访问的完整URL(包括查询参数)存在session的url.intended键里,你可以直接在登录视图里解析这个URL,提取出email参数:
打开resources/views/auth/login.blade.php,在邮箱输入框的位置添加如下逻辑:
@php // 从session获取用户原本想访问的URL $intendedUrl = session('url.intended'); $preFilledEmail = ''; if ($intendedUrl) { // 解析URL中的查询字符串 $queryString = parse_url($intendedUrl, PHP_URL_QUERY); parse_str($queryString, $queryParams); // 提取email参数,不存在则为空 $preFilledEmail = $queryParams['email'] ?? ''; } @endphp <!-- 邮箱输入框,优先使用旧输入(登录失败时),其次用提取的email --> <div class="form-group row"> <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label> <div class="col-md-6"> <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email', $preFilledEmail) }}" required autocomplete="email" autofocus> @error('email') <span class="invalid-feedback" role="alert"> <strong>{{ $message }}</strong> </span> @enderror </div> </div>
方法二:在登录控制器中处理后传递到视图
如果你更倾向于把逻辑放在控制器里(保持视图简洁),可以修改app/Http/Controllers/Auth/LoginController.php的showLoginForm方法:
<?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\AuthenticatesUsers; class LoginController extends Controller { use AuthenticatesUsers; protected $redirectTo = '/home'; public function __construct() { $this->middleware('guest')->except('logout'); } // 重写显示登录表单的方法 public function showLoginForm() { $preFilledEmail = ''; $intendedUrl = session('url.intended'); if ($intendedUrl) { $queryString = parse_url($intendedUrl, PHP_URL_QUERY); parse_str($queryString, $queryParams); $preFilledEmail = $queryParams['email'] ?? ''; } // 把email变量传递到视图 return view('auth.login', compact('preFilledEmail')); } }
然后在登录视图里直接使用这个变量填充输入框:
<input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email', $preFilledEmail) }}" required autocomplete="email" autofocus>
注意事项
- 确保你的路由使用了
web中间件组(默认已经包含),因为它负责启动session,这样url.intended才能被正确存储和读取。 - Laravel的
Authenticate中间件默认会用$request->fullUrl()来记录意图URL,这个方法会包含所有查询参数,所以不需要额外修改中间件逻辑。
内容的提问来源于stack exchange,提问作者Erikson Souza
相关产品推荐
相关产品推荐

