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

Laravel 如何将数据从LoginController传递到HomeController?,laravel,laravel-5.4,Laravel,Laravel 5.4,我想将输入信息($request->all())从我的LoginController传递到我的HomeController。我该怎么做?LoginController由Laravel scaffold生成 登录控制器: <?php namespace App\Http\Controllers\Auth; use \Auth; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\Authenticates

我想将输入信息(
$request->all()
)从我的LoginController传递到我的HomeController。我该怎么做?LoginController由Laravel scaffold生成

登录控制器:

<?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';
    }
}

如果要获取当前用户,该用户已使用登录数据进行了身份验证,则
\Auth:user()
将执行此操作。以下是HomeController的索引():

public function index()
{
    return \Auth::user();
}
如果您确实需要输入数据(实际上我无法想象这种情况),解决方案可能是将
request->all()
放入会话
session(['login\u data'=>$request->all()])
中,然后通过
session('login\u 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());
}
这将覆盖原始的
sendLoginResponse()
验证用户的方法。然后在
HomeController
中输入以下内容:

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

希望这有帮助

如果要获取当前用户,该用户已使用登录数据进行了身份验证,则
\Auth:user()
将执行此操作。以下是HomeController的索引():

public function index()
{
    return \Auth::user();
}
如果您确实需要输入数据(实际上我无法想象这种情况),解决方案可能是将
request->all()
放入会话
session(['login\u data'=>$request->all()])
中,然后通过
session('login\u 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());
}
这将覆盖原始的
sendLoginResponse()
验证用户的方法。然后在
HomeController
中输入以下内容:

public function index()
{
    return session('login_data');
}
希望这有帮助

又快又脏 以下方法是一种快速且肮脏的方法。这取决于Laravel的身份验证是如何设计的。如果Laravel在下一版本中更改了此项,则可能需要随之更改

LoginController
中,实现自己的
login()
方法。您需要重命名trait提供的
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);
    }
}
class RegisterController extends Controller 
{
    use RegistersUsers {
        register as traitRegister
    }

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

        return $this->traitRegister($request);
    }
}
在您的
RegisterController
中,实现您自己的
register()
方法。您需要重命名trait提供的
register()
方法,因为我们仍然希望调用它:

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

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

        return $this->traitLogin($request);
    }
}
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更改了traits的名称、方法名称、路由操作或方法内部使用的实际逻辑,则不会影响此功能的设计或工作方式

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

登入表格:

<input type="hidden" name="form_type" value="login" />
从这里,您可以将此中间件添加到
app/Http/Kernel.php
中的
web
中间件组,以便它用于所有web请求,或者您可以将此中间件添加到
LoginController
RegisterController
构造函数中,以便只有它们使用它

将中间件分配到某个位置后,更新
HomeController
以访问闪存数据:

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

        // the rest of your logic
    }
}
注意:提供的代码都没有经过测试。将其视为伪代码。

快速且肮脏 以下方法是一种快速且肮脏的方法。这取决于Laravel的身份验证是如何设计的。如果Laravel在下一版本中更改了此项,则可能需要随之更改

LoginController
中,实现自己的
login()
方法。您需要重命名trait提供的
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);
    }
}
class RegisterController extends Controller 
{
    use RegistersUsers {
        register as traitRegister
    }

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

        return $this->traitRegister($request);
    }
}
在您的
RegisterController
中,实现您自己的
register()
方法。您需要重命名trait提供的
register()
方法,因为我们仍然希望调用它:

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

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

        return $this->traitLogin($request);
    }
}
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更改了traits的名称、方法名称、路由操作或方法内部使用的实际逻辑,则不会影响此功能的设计或工作方式

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

登入表格:

<input type="hidden" name="form_type" value="login" />
从这里,您可以将此中间件添加到
app/Http/Kernel.php
中的
web
中间件组,以便它用于所有web请求,或者您可以将此中间件添加到
LoginController
RegisterController
构造函数中,以便只有它们使用它

将中间件分配到某个位置后,更新
HomeController
以访问闪存数据:

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

        // the rest of your logic
    }
}

注意:提供的代码都没有经过测试。将其视为伪代码。

为什么要这样做?你想“传递”什么数据?你是如何从一个控制器传递到另一个控制器的?可能想了解一下,但这有什么用呢?假设登录输入可能只是一个密码和用户名,后者你可以通过给定的用户模型访问。它的用途是我有一个页面,有两个模式(登录,注册). 所以在一页上有两种不同的表格。例如,当有人提交登录表单时,如果出现错误,则在您激活模式之前,该错误不可见。因此,根据提交的表单,我希望激活相关模式。因此,我的想法是在这两个字段中都添加一个隐藏字段,其值为
register
login
。这样我就可以决定要买什么了