【问题标题】:How to use a function from helper in routes?如何在路线中使用助手的功能?
【发布时间】:2019-11-14 22:27:04
【问题描述】:

我在 helpers.php 中有一个函数,我在任何刀片中使用它来检查管理员是否有权查看某些按钮,它也适用于控制器,但它不适用于路由,路由忽略它。

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

【问题讨论】:

标签: php laravel laravel-5 laravel-6


【解决方案1】:

您的路线不需要是有条件的。定义您需要的所有路由,然后您可以使用中间件之类的东西限制对它们的访问。您可以创建一个简单的中间件,它接受一个参数并在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

【讨论】:

  • 这是在处理请求之前处理逻辑的最合适的解决方案,middleware 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-06
相关资源
最近更新 更多