Php 如何捕获受保护的页面';查询字符串中的url?

Php 如何捕获受保护的页面';查询字符串中的url?,php,laravel,laravel-5.6,Php,Laravel,Laravel 5.6,当我试图为我的问题提供背景时,请注意一下 因此,我已经使用了将近一年的PythonWeb框架,它有一个很棒的扩展名为,帮助提供类似于laravel的用户会话管理 综上所述,Flask Login中有一个特定功能,它提供了当用户未登录或登录并试图访问需要验证的页面时所需的功能,例如/create\u post,他们将被重定向回登录页面,该页面编码在查询字符串中,如/login?next=%2fscreate\u post 我正试图在一个laravel项目中实现相同的功能,这样我就可以将用户重定向到

当我试图为我的问题提供背景时,请注意一下

因此,我已经使用了将近一年的PythonWeb框架,它有一个很棒的扩展名为,帮助提供类似于laravel的用户会话管理

综上所述,Flask Login中有一个特定功能,它提供了当用户未登录或登录并试图访问需要验证的页面时所需的功能,例如
/create\u post
,他们将被重定向回登录页面,该页面编码在查询字符串中,如
/login?next=%2fscreate\u post

我正试图在一个laravel项目中实现相同的功能,这样我就可以将用户重定向到他们可能首先想要去的页面,或者重定向到另一个路径,以防查询字符串不存在,并且我似乎无法找到将代码放在何处来实现这一点,并且我不想弄乱页面中的任何内容
vendor
目录(由于随之而来的明显问题),我尝试通过执行下面的操作来操作文件
app/Http/Middleware/RedirectIfAuthenticated.php
,但没有成功

public function handle($request, Closure $next, $guard = null)
{
    if (Auth::guard($guard)->check()) {
        return redirect('/');
    }

    $previous_url = url()->previous(); // how do I insert this in query string

    return $next($request);
}
我是否必须创建自己的中间件,或者在laravel中是否有其他实现此类功能的方法

注意:我没有使用默认的laravel身份验证系统。我已经创建了自己的控制器
sessioncontroller
,以处理包含以下代码的登录

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User;

class SessionsController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth')->except(['create', 'login']);
    }

    public function create()
    {
        $data = [
            'title' => 'Login',
            'body_class' => 'hold-transition login-page',
        ];

        return view('auth.login', $data);
    }

    public function login(Request $request)
    {
        $this->validate($request, [
            'username' => 'required',
            'password' => 'required',
        ]);

        $user = User::checkCredentials($request->username, $request->password);
        if (!$user) {
            return back()->with([
                'class' => 'alert-danger',
                'message' => 'Please check your credentials',
            ]);
        }

        // set session active flag to true
        $user->session_active = true;
        $user->save();

        auth()->login($user);
        return redirect()->route('dashboard');
    }

    public function destroy()
    {
        $user = auth()->user();
        $user->last_login = date('Y-m-d H:i:s');
        $user->session_active = false;
        $user->save();

        auth()->logout();

        return redirect()->route('login')->with([
            'class' => 'alert-success',
            'message' => 'You logged out successfully',
        ]);
    }
}

我设法在某种程度上解决了我的问题,尽管我没有像我所希望的那样使用查询字符串

我创建了一个助手函数
get\u previous\u url
,如下所示

/**
 * Gets the previous url
 * 
 * @return null|string
 */
function get_previous_url()
{
    $host = $_SERVER['HTTP_HOST'];
    $previous_url = url()->previous();

    // check if previous url is from the same host
    if (!str_contains($previous_url, $host)) {
        return null;
    }

    // get the previous url route
    list(, $route) = explode($host, $previous_url);

    // make sure the route is not the index, login or logout route
    if (in_array(substr($route, 1), ['', 'login', 'logout'])) {
        $route = '';
    }

    return $route;
}
然后我在
sessioncontroller
类的创建方法中调用了相同的函数

public function create()
{
    $previous_url =  get_previous_url();
    if ($previous_url) {
        session(['previous_url' => $previous_url]);
    }

    ... 
}
然后我将我的登录方法更改为

public function login(Request $request)
{
    ...

    $redirect = redirect()->route('dashboard'); // '/'
    if (session()->has('previous_url')) {
        $redirect = redirect(session()->pull('previous_url'));
    }

    return $redirect;
}

是的,您必须创建自己的中间件,内置重定向使用Laravels身份验证系统。不过,我建议您切换到Laravels自己的身份验证系统,因为它与系统和许多第三方软件包相关联。@misorude我已经添加了代码,希望能有所帮助。@OliverNybroe感谢您提供的提示,但我尝试了其他方法。你可以在我发布的答案中查看它。顺便说一句,还有一个重定向()->back()method@OliverNybroe我想要一种储存它并在以后使用它的方法,而不是立即,