如何将数据从 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 请求,或者您可以将此中间件添加到 LoginController
和 RegisterController
构造函数,以便只有他们使用它。
在某处分配中间件后,更新您的 HomeController
以访问闪存数据:
class HomeController extends Controller
{
public function index(Request $request)
{
$form = $request->session()->get('form_type');
// the rest of your logic
}
}
注意:none 提供的代码已经过测试。视为 pseudo-code.
我想将我的输入信息 ($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 请求,或者您可以将此中间件添加到 LoginController
和 RegisterController
构造函数,以便只有他们使用它。
在某处分配中间件后,更新您的 HomeController
以访问闪存数据:
class HomeController extends Controller
{
public function index(Request $request)
{
$form = $request->session()->get('form_type');
// the rest of your logic
}
}
注意:none 提供的代码已经过测试。视为 pseudo-code.