2016-06-29 11 views
7

Próbuję zaimplementować system logowania, w którym użytkownik zostanie przekierowany z powrotem tylko wtedy, gdy w adresie URL jest parametr get, w przeciwnym razie przekieruje go do strona profilu.Laravel 5 jak korzystać z parametru get z adresu URL z metodą logowania kontrolera

Tak więc, jeśli uri jest coś takiego (bez parametru GET)

/login 

jeśli sukcesem, użytkownik będzie przekierowywać do strony profilu.

Ale jeśli uri ma parametru GET jak na przykład

/login?r=articles 

użytkownik zostanie przekierowany do strony z artykułami zamiast domyślnej trasy do strony profilu.

Pytanie, w jaki sposób można to zrobić, jeśli to możliwe, lub jak sprawdzić parametr get?

routes.php

// Signin 
Route::post('/account/signin', [ 
    'uses' => '[email protected]', 
    '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> 

Dzięki.

Updated

Dziękuję wszystkim za odpowiedzi, faktem jest, że nadal jestem poznanie laravel a to pewnie dlatego, że nie można wdrożyć odpowiednie rozwiązania, które wy współdzielonych.

Tak powiedziawszy, działałem, tworząc warunkowe ukryte pole, które przechowuje wartość zapytania i w ten sposób, po przesłaniu formularza przez użytkownika, zostanie ono przekazane wraz z resztą argumentów $ 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(); 
} 

Jak tak, to działa.

Nie wiem, czy jest to wykonalny i bezpieczny sposób na zrobienie tego w Laravel 5, ale działa.

+0

proszę przyjąć moją odpowiedź – msonowal

+0

Przepraszam @ManashSonowal ale nadal nie mogę sprawić, żeby działało ... – Bruno

Odpowiedz

9

Kiedy masz URI takich jak login?r=articles można odzyskać articles takiego:

request()->r 

Wierzę, można również użyć request()->has('r') w celu ustalenia, czy jest obecna w URI.

+0

Dzięki @ user2094178, który pozwolił na zastąpienie zmiennej $ _GET var – Bruno

+0

Świetna odpowiedź. Dziękuję Ci – kikuyu1

2

// tylko zapytania

$query_array = $request->query(); 

lub

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

// Bez Query String ...

$url = $request->url(); 

// Z Query String ...

$url = $request->fullUrl(); 
+0

Dziękuję za odpowiedź, ale jak używam laravel chciałbym użyć funkcji Laravel do tego. – Bruno

+0

zobacz moją zaktualizowaną odpowiedź. –

+0

Dziękujemy @laraveluser – Bruno

3

Jeśli używasz laravel następnie używać ich pomocnika, który działa tylko po wyjęciu z pudełka, to znaczy, czy trasa lub url ma middlewere auth i użytkownik nie jest zalogowany, to idzie się zalogować i w postSign lub wewnątrz próbie tylko

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

UserController

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

}

+0

Nie można go uruchomić – Bruno

+0

Czy możesz być bardziej opisowy? jaki był błąd lub jaki jest status, abym mógł Cię prowadzić? – msonowal

Powiązane problemy