在Laravel中使用路由验证请求URI的更好方法

时间:2019-05-15 21:39:37

标签: php laravel

当前,如果您碰到了某条路线,我将使用条件逻辑进行重定向。问题1,我目前的操作方式不允许参数通过路由,因此它会出错,而不仅仅是检查路由是否匹配。问题2这种方法草率繁琐。我真的需要解决问题1,我可以不清理就住,但我真的很想。

目前我正在做这样的事情

namespace App\Http\Middleware;

use Auth;
use Closure;

class myMiddleware
{
    public function handle($request, Closure $next)
    {
        if($user = Auth::user()){
            // Do some stuff
        } else {
            if(
               $request->getUri() != route('login') &&
               $request->getUri() != route('password.request') &&
               $request->getUri() != route('password.reset', null) //<-- This doesn't work because a parameter isn't properly given, want ANY param here
              )
            { 
                return redirect()->route('login')->with('warning', 'Please Login to access restricted area.');
            }
        }
        return $next($request);
    }
}

我想以一种更简洁的方式对此进行说明,但是如果URI由于某些原因发生了更改,仍然可以引用路由的“名称”。

1 个答案:

答案 0 :(得分:0)

听起来您正在尝试做Laravel已经提供的操作。

有两种中间件authguest需要登录,也可以不登录。最好的使用方式是在小组中。

$router->middleware('auth:user')->group(function (Router $router) {
    // Your routes that require a user to be logged in
});

$router->middleware('guest:user')->group(function (Router $router) {
    // Your routes that require a user not be logged in
});

中间件的:user部分指定了防护,如果只有一个防护,则可以省略。

尽管以上绝对是您特定用例所需的100%,但是有一种更好的方法来检查路由是否符合您的需求,即请求对象上的routeIs()方法。 / p>

因此要替换代码中的if语句,将是:

if ($request->routeIs('login', 'password.*')) {
    // Code
}

如果当前路由的名称为login或名称以password.开头,则返回true。

我想强调一下,authguest中间件组绝对是您应该做的,但是我补充了这一点,因为我觉得这就是您想要的功能。

以一个的价格得到两个答案。