如何使用laravel 5调用__constructor中的函数?

时间:2016-06-03 13:23:55

标签: laravel laravel-5.2

我是根据用户权限从数据库中获取菜单并将其显示到我的网页,但是如果我访问任何其他人没有访问权限的URL,则会打开该页面。 为此,我创建并调用了access_denied函数,该函数重定向用户的主页。 我从AuthController的构造函数调用了access_denied函数,因为AuthController在每个页面都被加载。

我使用了以下代码

AuthController

public function __construct()
{
    $this->accessDenied();
}

public function accessDenied() 
    {
        $url_segment1 = Request::segment(1);
        $url_segment2 = Request::segment(2);

        $url_segment = $url_segment1 . '/' . $url_segment2;
        $user_data = Auth::user()->toArray();
        $dadmin = array_keys($user_data['admin']);
        //this is sample of array 
        //    $user_data['admin'] => Array
        //          (
        //           [admin/roles] => 1
        //          )
        if (!in_array($url_segment, $dadmin)) {
            return redirect('/home');
        }    
    }

但我收到了以下错误

Non-static method Illuminate\Http\Request::segment() should not be called statically, assuming $this from incompatible context

如果我使用了错误的流程,请建议我在主页上重定向未经授权的用户的正确方法。

2 个答案:

答案 0 :(得分:1)

首先,您应该创建一个中间件。在命令提示符下键入:

php artisan make:middleware AccessDenyMiddleware

然后你去app / Http / Middleware / AccessDenyMiddleware.php并填写句柄函数{你自己的代码}

    $url_segment1 = Request::segment(1);
    $url_segment2 = Request::segment(2);

    $url_segment = $url_segment1 . '/' . $url_segment2;
    $user_data = Auth::user()->toArray();
    $dadmin = array_keys($user_data['admin']);
    //this is sample of array 
    //    $user_data['admin'] => Array
    //          (
    //           [admin/roles] => 1
    //          )
    if (!in_array($url_segment, $dadmin)) {
        return redirect('/home');
    }   

但添加以下行

return $next($request); // If passed, proceed with the route

然后,在路线中,您应键入:

Route::get('/yoururlhere', ['middleware' => 'AccessDenyMiddleware', function() { /* Put your work here */ } ]);

有更好的方法。与授权一样,如果您使用的是Laravel 5.2

如果您使用的是Laravel 5,可能会更改默认的Authenticate中间件

答案 1 :(得分:1)

您可以使用中间件https://laravel.com/docs/5.2/middleware#introduction

php artisan make:中间件RoleRouteMiddleware

您应该将该代码放在中间件“App \ Http \ Middleware \ RoleRouteMiddleware”的handle方法中,并使用$ request变量而不是facade请求。

中间件会将earch请求过滤到您的应用。

注册中间件,将其添加到app / Http / Kernel.php中的routeMiddleware数组

protected $routeMiddleware = [
    ....
    'alias' => App\Http\Middleware\RoleRouteMiddleware::class,
];

然后在特定路线上使用它:

Route::get('admin/profile', ['middleware' => 'alias', function () {
    //your code here
}]);

或路线gruoups:

Route::group(['middleware' => 'alias', function () {
    //your filtered routes
}]);