Подтвердить что ты не робот

Laravel 5 как использовать параметр get из url с помощью метода входа в контроллер

Я пытаюсь внедрить систему входа, в которой пользователь будет перенаправляться обратно, только если в URL-адресе есть параметр get, иначе он будет перенаправлен на страницу профиля.

Итак, если uri - это что-то вроде этого (нет параметра get)

/login

если успех, пользователь будет перенаправлен на страницу профиля.

Но если uri имеет параметр get, например,

/login?r=articles

пользователь будет перенаправлен на страницу статей вместо маршрута по умолчанию на страницу профиля.

Вопрос в контроллере, как это сделать, если это возможно, или как я могу проверить параметр 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 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, но он работает.

4b9b3361

Ответ 1

Когда у вас есть такой URI, как login?r=articles, вы можете получить articles подобные этой:

request()->r

Вы также можете использовать request()->has('r') чтобы определить, присутствует ли он в URI.

И request()->filled('r') чтобы выяснить, присутствует ли он в URI и его значение не пустое.

Ответ 2

Если вы используете Laravel, тогда используйте их помощник, который работает только из коробки, т.е. если ваш маршрут или url имеет авторизуемую авторизацию, а пользователь не регистрируется, тогда он переходит на логин и в вашу postSign или внутри попытку просто

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

}

Ответ 3

//только запрос

$query_array = $request->query();

или

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

//Без строки запроса...

$url = $request->url();

//С строкой запроса...

$url = $request->fullUrl();

Ответ 4

сначала используйте это

use Illuminate\Support\Facades\Input;

тогда вы можете получить любые данные из вашего URL

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