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

How to use a function from helper in routes?

我在 helpers.php 中有一个函数,我在任何 blade 中使用它来检查管理员是否有权查看某些按钮,它在 Controllers 中也有效,但在路由,忽略它的路由。

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

我在blade/view.

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

但是routes忽略了这个功能,打开了所有的routes。我在如下路线中使用该功能。有什么想法吗?

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

您的路线不需要有条件。定义您需要的所有路由,然后您可以使用中间件之类的东西限制对它们的访问。您可以创建一个简单的中间件,它接受一个参数并在 app/Http/Middleware/CanDoIt.php:

中调用您的 can 函数
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