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()-&gt;has('r') 来确定它是否存在于 URI 中。

request()-&gt;filled('r') 来确定它是否存在于 URI 中并且它的值不为空。

【讨论】:

感谢@user2094178 允许替换 $_GET var 很好的答案。谢谢 @user2094178,如果我有 2 个或更多密钥可以从 URL 获取。例如: ?id=123=?val=test 我的问题,如果我 "request()->id" 它会返回 "123=?val=test" 应该是?id=123&amp;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 控制器

Laravel 5.4 登录后重定向到自定义 url

将数组从 AuthController 传递到 Laravel 5 中的登录视图

Laravel 5.6 - 在控制器中按名称获取路由

如何在 Vue JS 中使用 Laravel 进行身份验证,以便用户在没有登录的情况下无法从 URL 进入他的页面

Laravel 5.2 Entrust:如果他手动添加受限URL,则重定向用户