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
。这样我就可以决定要买什么了