Php 如何在路由中使用来自帮助器的函数?

Php 如何在路由中使用来自帮助器的函数?,php,laravel,laravel-5,laravel-6,Php,Laravel,Laravel 5,Laravel 6,我在helpers.php中有一个函数,我在任何刀片服务器中都使用该函数来检查管理员是否有权查看某些按钮,它也在控制器中工作,但它在路由中不工作,路由忽略它 函数可以($permission) { $userCheck=auth()->guard('admin')->check(); $user=''; 如果($userCheck==false){ 返回重定向('admin/login'); }否则{ $user=auth()->guard('admin')->user(); } 如果($use

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

函数可以($permission)
{
$userCheck=auth()->guard('admin')->check();
$user='';
如果($userCheck==false){
返回重定向('admin/login');
}否则{
$user=auth()->guard('admin')->user();
}
如果($user->id==1){
返回true;
}
$minutes=5;
$permissions=Cache::记住('permissions.'$user->id,$minutes,function()使用($user){
返回explode(“,”,$user->permission->permission);
});
$permissions=数组展平($permissions);
返回数组($permission,$permissions);
}
我在刀片/视图中这样使用它

@if(can('admins'))
@恩迪夫
但是,routes会忽略该功能并打开所有routes。我在如下路线中使用该功能。有什么想法吗

if(can('admins')){
路由::get('home','Admin\AdminController@index')->name('admin.home');
路由::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')

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


路由是在发送请求之前定义的(在启动会话和身份验证的中间件之前)。。。此外,完全没有理由使用条件路由。这是在处理请求之前处理逻辑的最合适的解决方案,
中间件方法。
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');
});