web-dev-qa-db-fra.com

Laravel 5 comment utiliser le paramètre get de l'url avec la méthode de connexion du contrôleur

J'essaie d'implémenter un système de connexion où l'utilisateur sera redirigé uniquement s'il y a un paramètre get dans l'url, sinon il sera redirigé vers la page de profil.

Donc, si l'uri est quelque chose comme ça (pas de paramètre get)

/login

en cas de succès, l'utilisateur sera redirigé vers la page de profil.

Mais si l'uri a le paramètre get comme par exemple

/login?r=articles

l'utilisateur sera redirigé vers la page des articles au lieu de l'itinéraire par défaut vers la page de profil.

La question est, dans le contrôleur, comment faire cela, si possible, ou comment puis-je vérifier le paramètre get?

routes.php

// Signin
Route::post('/account/signin', [
    'uses' => 'UserController@postSignIn',
    'as' => 'user.signin',
]);

serController.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>

Merci.

Mise à jour

Merci à tous pour vos réponses, le fait est que je continue à connaître Laravel et c'est probablement pourquoi je ne peux pas implémenter correctement les solutions que vous avez partagées.

Cela dit, je l'ai fait fonctionner en créant un champ caché conditionnel qui contient la valeur de la requête et de cette façon, une fois que l'utilisateur soumet le formulaire, il sera transmis avec le reste des arguments de réponse $.

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();
}

Comme ça, ça marche.

Je ne sais pas si c'est un moyen viable et sécurisé de le faire dans Laravel 5, mais cela fonctionne.

12
Bruno

Lorsque vous avez un URI tel que login?r=articles, Vous pouvez récupérer articles comme ceci:

request()->r

Vous pouvez également utiliser request()->has('r') pour déterminer s'il est présent dans l'URI.

Et request()->filled('r') pour savoir s'il est présent dans l'URI et si sa valeur n'est pas vide.

24
user2094178

Si vous utilisez Laravel alors utilisez leur assistant qui fonctionne juste à la sortie de la boîte, c'est-à-dire si votre itinéraire ou votre URL a un middlewere d'authentification et que l'utilisateur n'est pas connecté, il se connecte et se connecte à votre postSign ou tentative intérieure uniquement

 return redirect()->intended('home'); //home is the fallback if no intended url is provide

serController

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();

}

3
msonowal

// uniquement requête

$query_array = $request->query();

ou

$query = $request->query('r');

// Sans chaîne de requête ...

$url = $request->url();

// Avec chaîne de requête ...

$url = $request->fullUrl();
2
Laravel User

utiliser d'abord ceci

use Illuminate\Support\Facades\Input;

alors vous pouvez obtenir toutes les données de votre URL

$name=Input::get('term', false); //term is the parameter name we get from URL
0
Ali Hassan