如何在路由中使用助手的功能?

时间:2019-11-14 22:27:04

标签: php laravel laravel-5 laravel-6

我在helpers.php中有一个函数,我可以在任何刀片中使用该函数来检查管理员是否有权查看某些按钮,它也可以在Controllers中工作,但是在路由中却不起作用,而忽略该路由。 / p>

function can($permission)
{
    $userCheck = auth()->guard('admin')->check();
    $user = '';

    if ($userCheck === false) {
        return redirect('admin/login');
    } else {
        $user = auth()->guard('admin')->user();
    }

    if ($user->id === 1) {
        return true;
    }

    $minutes = 5;
    $permissions = Cache::remember('permissions_'.$user->id, $minutes, function () use ($user) {
        return explode(',', $user->permission->permission);
    });

    $permissions = array_flatten($permissions);

    return in_array($permission, $permissions);
}

我在刀片/视图中像这样使用它。

@if(can('admins'))
    <a href="{{ url(getLocal().'/admin/admins') }}" class="nav-link nav-toggle">
@endif

但是,路由会忽略该功能并打开所有路由。我在如下所示的路由中使用该功能。有什么想法吗?

if (can('admins')) {
    Route::get('home', 'Admin\AdminController@index')->name('admin.home');
    Route::get('/admins/{id}/edit', 'Admin\AdminController@edit')->name('admins.edit');
}

2 个答案:

答案 0 :(得分:1)

您的路线不必是有条件的。定义所需的所有路由,然后可以使用中间件之类的方法限制对它们的访问。您可以创建一个简单的中间件,该中间件带有一个参数并在can中调用您的app/Http/Middleware/CanDoIt.php函数:

namespace App\Http\Middleware;

use Closure;

class CanDoIt
{
    public function handle($request, Closure $next, $permission)
    {
        if (! can($permission)) {
            // redirect to some where else
        }

        // allow the request to pass through
        return $next($request);
    }
}

您可以进入app/Http/Kernel.php并将中间件添加到$routeMiddleware数组中:

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

然后,您可以将该中间件分配给要受can('admins')限制的路由组

Route::middleware('check:admins')->group(function () {
    Route::get('home', 'Admin\AdminController@index')->name('admin.home');
    Route::get('/admins/{id}/edit', 'Admin\AdminController@edit')->name('admins.edit');
});

我没有命名中间件can,因为可能已经有一个名为can的中间件注册为授权。

Laravel 6.x Docs - Middleware - Defining Middleware

Laravel 6.x Docs - Middleware - Middleware Parameters

答案 1 :(得分:0)

只需转到位于Laravel项目中的composer.json文件

"autoload": {
    "files": [
        "app/Helpers/Helper.php"
    ],
    "classmap": [
        "database/seeds",
        "database/factories"
    ],
    "psr-4": {
        "App\\": "app/"
    }
},

更改composer.json文件并向files数组添加新路径后,需要转储自动加载器。

composer dump-autoload

现在,您的帮助程序文件将自动加载到您的Laravel项目中。

如果您的帮助程序文件包含具有这些帮助程序方法的类,并且您已指定了名称空间,则可以通过定义别名来轻松使用它们。您可以通过在config / app.php文件中的aliases数组的末尾添加以下内容来轻松做到这一点。

以别名写入

 'Helper' => App\Helpers\Helper::class,

现在在您的web.php中,您可以使用助手功能

Route::post('path', function() {   
    Helper::getAreas();//use helper here
})->name('name of route');