好的。我遇到了这个问题,也许有人会发现这个修复很有用。
基本上,您需要在用户未登录时将数据存储在会话中,并在用户登录(或创建帐户)时将其写入您的持久存储。
要获取表单数据,创建一个扩展 Laravel 的 auth 中间件的新中间件:
/**
* Class FormDataMiddleware
*
* @package App\Http\Middleware
*/
class FormDataMiddleware extends Authenticate
{
/**
* Handle an incoming request.
*
* Check if a request is a POST/PATCH and store the request body
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
*
* @param array $guards
*
* @return mixed
*/
public function handle($request, Closure $next, ...$guards)
{
if (!Auth::check() && !$request->isMethodIdempotent()) {
Session::put('form-data', [
'data' => $request->except(['token']),
]);
}
return parent::handle($request, $next);
}
您现在可以在端点上应用您的中间件。请记住在内核文件中注册您的中间件,如下所示:
/**
* The application's route middleware.
*
* These middleware may be assigned to groups or used individually.
*
* @var array
*/
protected $routeMiddleware = [
// Other middleware declarations here
'form-data' => \App\Http\Middleware\FormDataMiddleware::class,
];
不要在同一路由上使用 auth 中间件。
Laravel 默认的LoginController 有一个authenticated 函数,当用户成功认证时调用。这将是您逻辑的理想场所。类似的东西:
/**
* The user has been authenticated.
*
* @param \Illuminate\Http\Request $request
* @param mixed $user
*
* @return mixed
*/
protected function authenticated(Request $request, $user)
{
if (Session::has('form-data')) {
$form = Session::pull('form-data');
// Authorize
if ($user->can('create', self::class)) {
// FIXME: Validate data
$question = $user->questions()->create(array_get($form, 'data'));
return redirect(route('questions.show', $question));
}
// We simply loose the form
}
}
这适用于登录,您需要对新帐户执行相同操作。 RegisterController 也有一个函数 registered,其行为与上述 authenticated 方法相同。把你的代码放在那里!