Laravel 5如何通过控制器的登录方法从url获取参数
Posted
技术标签:
【中文标题】Laravel 5如何通过控制器的登录方法从url获取参数【英文标题】:Laravel 5 how to use get parameter from url with controller's sign in method 【发布时间】:2016-06-29 18:06:57 【问题描述】:我正在尝试实现一个登录系统,只有当 url 中有 get 参数时,用户才会被重定向回来,否则它将被重定向到个人资料页面。
所以,如果 uri 是这样的(没有 get 参数)
/login
如果成功,用户将被重定向到个人资料页面。
但如果 uri 有 get 参数,例如
/login?r=articles
用户将被重定向到文章页面,而不是默认路由到个人资料页面。
问题是,在控制器中,如果可能,如何执行此操作,或者如何检查 get 参数?
routes.php
// Signin
Route::post('/account/signin', [
'uses' => 'UserController@postSignIn',
'as' => 'user.signin',
]);
UserController.php
// Signin
public function postSignIn(Request $request)
$this->validate($request, [
'login-email' => 'required|email',
'login-password' => 'required'
]);
if ( Auth::attempt(['email' => $request['login-email'], 'password' => $request['login-password']]) )
// Tried this, isn't working... (maybe something's missing ??)
$redirect = $request->input('r');
if ($redirect)
return redirect()->route($redirect);
// -->
return redirect()->route('user.account');
return redirect()->back();
signin.blade.php
<form role="form" action=" route('user.signin') " method="post" class="login-form" name="login">
<div class="form-group $errors->has('login-email') ? 'has-error' : '' ">
<label class="sr-only" for="email">Email</label>
<input type="text" name="login-email" value=" Request::old('login-email') " placeholder="Email..." class="form-username form-control" id="form-username">
</div>
<div class="form-group $errors->has('login-password') ? 'has-error' : '' ">
<label class="sr-only" for="password">Password</label>
<input type="password" name="login-password" value=" Request::old('login-password') " placeholder="Password..." class="form-password form-control" id="form-password">
</div>
<div class="form-group">
<input type="checkbox" name="remember" value=" Request::old('remember') " id="remember">
Remember
</div>
<button type="submit" class="btn">Sign in!</button>
<input type="hidden" name="_token" value=" Session::token() ">
</form>
谢谢。
更新
谢谢大家的回复,事实是我还在了解 Laravel,这可能就是为什么我无法正确实施你们分享的解决方案。
也就是说,我通过创建一个条件隐藏字段来保存查询值,这样一旦用户提交表单,它将与其余的 $response 参数一起传递。
signin.blade.php
<form role="form" action=" route('user.signin') " method="post" class="login-form" name="login">
<div class="form-group $errors->has('login-email') ? 'has-error' : '' ">
<label class="sr-only" for="email">Email</label>
<input type="text" name="login-email" value=" Request::old('login-email') " placeholder="Email..." class="form-username form-control" id="form-username">
</div>
<div class="form-group $errors->has('login-password') ? 'has-error' : '' ">
<label class="sr-only" for="password">Password</label>
<input type="password" name="login-password" value=" Request::old('login-password') " placeholder="Password..." class="form-password form-control" id="form-password">
</div>
<div class="form-group">
<input type="checkbox" name="remember" value=" Request::old('remember') " id="remember">
Remember
</div>
<button type="submit" class="btn">Sign in!</button>
<input type="hidden" name="_token" value=" Session::token() ">
<!-- Verify condition -->
@if(isset($_GET['referer']))
<input type="hidden" name="referer" value=" $_GET['referer'] ">
@endif
</form>
UserController.php
// Signin
public function postSignIn(Request $request)
$this->validate($request, [
'login-email' => 'required|email',
'login-password' => 'required'
]);
if ( Auth::attempt(['email' => $request['login-email'], 'password' => $request['login-password']]) )
// Check for the new argument 'referer'
if (isset($request->referer))
return redirect()->route($request->referer);
// -->
return redirect()->route('user.account');
return redirect()->back();
就像这样,它可以工作。
不知道这在 Laravel 5 中是否可行且安全,但它确实有效。
【问题讨论】:
请接受我的回答 对不起@ManashSonowal,但我仍然无法让它工作...... 【参考方案1】:当你有一个URI比如login?r=articles
时,你可以像这样检索articles
:
request()->r
您还可以使用request()->has('r')
来确定它是否存在于 URI 中。
和request()->filled('r')
来确定它是否存在于 URI 中并且它的值不为空。
【讨论】:
感谢@user2094178 允许替换 $_GET var 很好的答案。谢谢 @user2094178,如果我有 2 个或更多密钥可以从 URL 获取。例如: ?id=123=?val=test 我的问题,如果我 "request()->id" 它会返回 "123=?val=test" 应该是?id=123&val=test
。【参考方案2】:
// 只查询
$query_array = $request->query();
或
$query = $request->query('r');
// 没有查询字符串...
$url = $request->url();
// 使用查询字符串...
$url = $request->fullUrl();
【讨论】:
感谢您的回复,但由于我正在使用 laravel,我想使用 Laravel 的功能来做到这一点。【参考方案3】:如果您使用的是 Laravel,请使用他们开箱即用的助手,即如果您的路由或 url 有一个 auth 中间人并且用户未登录,那么它会登录并在您的 postSign 或内部尝试中
return redirect()->intended('home'); //home is the fallback if no intended url is provide
用户控制器
public function postSignIn(Request $request)
$this->validate($request, [
'login-email' => 'required|email',
'login-password' => 'required'
]);
if ( Auth::attempt(['email' => $request['login-email'], 'password' => $request['login-password']]) )
return redirect()->intended('user.account);
return redirect()->back();
【讨论】:
你能描述得更详细些吗?什么是错误或什么状态,以便我可以指导你>?【参考方案4】:先用这个
use Illuminate\Support\Facades\Input;
然后你可以从你的 url 获取任何数据
$name=Input::get('term', false); //term is the parameter name we get from URL
【讨论】:
【参考方案5】:如果你还在这个任务中,你可以使用
请求
喜欢
$request->r
【讨论】:
以上是关于Laravel 5如何通过控制器的登录方法从url获取参数的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 post 方法将数据从 ajax 传递到 laravel 5.2 控制器
将数组从 AuthController 传递到 Laravel 5 中的登录视图