如何将数据从 LoginController 传递到我的 HomeController?

How do I pass data from LoginController to my HomeController?

我想将我的输入信息 ($request->all()) 从我的 LoginController 传递到我的 HomeController。我怎样才能做到这一点? LoginController 由 Laravel 脚手架生成。

登录控制器:

<?php

namespace App\Http\Controllers\Auth;

use \Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Auth\Authenticatable;
use Illuminate\Http\Request;
use App\Account;

class LoginController extends Controller 
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/home';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct(Request $request)
    {
        $this->middleware('guest', ['except' => 'logout']);
    }

    /**
    * Override the username method used to validate login
    *
    * @return string
    */
    public function username()
    {
        return 'username';
    }
}

HomeController 其中 dd($request->all() returns []

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Blog;
use App\Account;
use Illuminate\Foundation\Auth;
use Illuminate\Support\Facades\Input;

class HomeController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        //$this->middleware('auth');
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        $blogItems = Blog::all();
        $onlinePlayers = Account::getOnlinePlayers()->count();
        $onlineStaff = Account::getOnlineStaff()->count();
        //return view('home.index', compact('blogItems', 'onlinePlayers', 'onlineStaff'));

        return dd($request->all()); //This returns an empty array
    }
}

如果您想获得当前用户,即使用您的登录数据进行身份验证,那么 \Auth:user() 就可以了。这是 HomeController 的 index():

public function index()
{
    return \Auth::user();
}

如果你真的需要输入数据(实际上我无法想象这种情况),一个解决方案可能是将 request->all() 放在会话 session(['login_data' => $request->all() ]) 中,然后通过 session('login_data') 检索它。如果您这样做,请将此方法添加到您的 LoginController:

/**
 * Send the response after the user was authenticated.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
protected function sendLoginResponse(Request $request)
{
    $request->session()->regenerate();

    $this->clearLoginAttempts($request);

    session(['login_data' => $request->all() ]);

    return $this->authenticated($request, $this->guard()->user())
        ?: redirect()->intended($this->redirectPath());
}

这会覆盖 AuthenticatesUsers 特征的原始 sendLoginResponse() 方法。然后在 HomeController 中输入:

public function index()
{
    return session('login_data');
}

希望对您有所帮助!

又快又脏

以下方法是一种快速而肮脏的方法。它依赖于 Laravel 的身份验证在幕后是如何设计的。如果Laravel在下一个版本中改变了这一点,这可能需要随之改变。

在您的 LoginController 中,实现您自己的 login() 方法。您将需要重命名特征提供的 login() 方法,因为我们仍想调用它:

class LoginController extends Controller 
{
    use AuthenticatesUsers {
        login as traitLogin
    }

    public function login(Request $request)
    {
        $request->session()->flash('form_type', 'login');

        return $this->traitLogin($request);
    }
}

在您的 RegisterController 中,实现您自己的 register() 方法。您将需要重命名特征提供的 register() 方法,因为我们仍想调用它:

class RegisterController extends Controller 
{
    use RegistersUsers {
        register as traitRegister
    }

    public function register(Request $request)
    {
        $request->session()->flash('form_type', 'register');

        return $this->traitRegister($request);
    }
}

现在,在您的 HomeController 中,您可以从闪烁的会话数据中获取提交的表单类型。

class HomeController extends Controller
{
    public function index(Request $request)
    {
        $form = $request->session()->get('form_type');

        // the rest of your logic
    }
}

清洁工

与上述方法相反,我建议使用隐藏的表单值和新的中间件来处理该表单值。

这更简洁一些,因为它不依赖于任何内置的 Laravel 身份验证逻辑。如果 Laravel 更改特征名称、方法名称、路由操作或方法内部使用的实际逻辑,则不会影响此功能的设计方式或工作方式。

在您的登录和注册表单中,添加一个新的隐藏字段:

登录表单:

<input type="hidden" name="form_type" value="login" />

注册表单:

<input type="hidden" name="form_type" value="register" />

现在,创建一个中间件来处理这个新的表单元素并将值闪存到会话。

class FlashFormType
{
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        if ($request->has('form_type')) {
            $request->session()->flash('form_type', $request->input('form_type'));
        }

        return $response;
    }
}

从这里,您可以将此中间件添加到 app/Http/Kernel.php 中的 web 中间件组,以便它用于所有 Web 请求,或者您可以将此中间件添加到 LoginControllerRegisterController 构造函数,以便只有他们使用它。

在某处分配中间件后,更新您的 HomeController 以访问闪存数据:

class HomeController extends Controller
{
    public function index(Request $request)
    {
        $form = $request->session()->get('form_type');

        // the rest of your logic
    }
}

注意:none 提供的代码已经过测试。视为 pseudo-code.