【问题标题】:Laravel Form Submission after Authentication认证后提交 Laravel 表单
【发布时间】:2016-05-14 03:41:20
【问题描述】:

我正在开发一个公开的表单,但需要当前用户登录才能提交。

这是我的路线:

Route::get('exmpleForm', ['as' => 'exmpleForm', 'uses' => 'ExmpleFormController@create']);

/* Routes for form submission. */
Route::group([
    'middleware' => ['auth', 'role:user']
], function() {
    Route::post('exmpleForm', ['as' => 'exmpleForm.store', 'uses' => 'ExmpleFormController@store']);
});

现在发生了什么:

当未经身份验证的用户提交表单时,他们会被重定向到登录页面。登录后,他们被重定向回表单,但没有提交。

我需要什么:

用户登录后,我需要表单提交旧数据。我该如何实现?

【问题讨论】:

    标签: php forms authentication laravel-5 request


    【解决方案1】:

    如果你也可以在Route::group 中添加这个表单就好了

    Route::group(['middleware' => ['auth', 'role:user']], function() {
        Route::get('exmpleForm', .....);
        Route::post('exmpleForm', .....);
    });
    

    让用户更容易理解他需要在提交表单之前进行身份验证。

    或者你可以尝试使用Session来放置这个数据表单,并在用户认证后得到这个

    .session()->put('formData', $data);
    

    https://laravel.com/docs/5.1/session#basic-usage

    【讨论】:

    • 我想保持表单公开,让所有访问者都可以看到,所以第一个选项不是解决方案。您能告诉我在身份验证控制器中如何获取表单请求(或表单数据)吗?
    • 是的,在 app/Http/Middleware/Authenticate.php public function handle($request....) dd($request->input()); ..
    【解决方案2】:

    您需要将数据存储在某个地方(会话可以)。

    但是,最好的方法是使用模式对话框和 ajax 查询来验证用户身份,而不是进行重定向。

    【讨论】:

    • 谢谢。我也在考虑类似的解决方案,显示带有登录选项的模式。
    【解决方案3】:

    好的。我遇到了这个问题,也许有人会发现这个修复很有用。

    基本上,您需要在用户未登录时将数据存储在会话中,并在用户登录(或创建帐户)时将其写入您的持久存储。

    要获取表单数据,创建一个扩展 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 方法相同。把你的代码放在那里!

    【讨论】:

      猜你喜欢
      • 2017-11-01
      • 2018-03-28
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      相关资源
      最近更新 更多