Php 添加功能以启用或禁用用户根据分配的发票使用特定功能

Php 添加功能以启用或禁用用户根据分配的发票使用特定功能,php,laravel,eloquent,middleware,laravel-8,Php,Laravel,Eloquent,Middleware,Laravel 8,我正在从事一个项目,其中我有三种类型的用户Admin和user1和user2。我希望user1和user2能够在应用程序中使用某些功能,前提是管理员已经为它们分配了发票。我试过使用下面给出的helper函数 $invoice = Invoice::pluck('user_id')->toArray(); if (Auth::user()->admin == 1 || in_array(Auth::user()->id, $invoice)) { ret

我正在从事一个项目,其中我有三种类型的用户Adminuser1user2。我希望user1user2能够在应用程序中使用某些功能,前提是管理员已经为它们分配了发票。我试过使用下面给出的helper函数

 $invoice = Invoice::pluck('user_id')->toArray();
    if (Auth::user()->admin == 1 || in_array(Auth::user()->id, $invoice)) {
        return 1;
    } else {
        return 0;
    }
但这并不奏效。我必须将它放在控制器的每个方法之前,以限制用户使用该功能。还有什么我能做的吗?
有更好的方法吗?

您可以使用make中间件和pass requests throw来检查用户是否有权这样做

class SomeMidllewareName
{
    /**
     * Handle an incoming request.
     *
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        $invoice = Invoice::pluck('user_id')->toArray();
        if (1 == Auth::user()->admin || in_array(Auth::user()->id, $invoice)) {
            return $next($request);
        }

        return \response()->json(['message' => 'you are not authorized'], 401);
    }
}
然后,您可以在路由上进行验证,还可以使用策略并单独验证您可以使用的每个功能

使用

php artisan make:middleware UserWithInvoiceMiddleware 然后在
app/Http/Middleware/UserWithInvoiceMiddleware.php
中打开文件,并将其添加到
句柄
方法:

公共函数句柄($request,Closure$next,…$guards)
{
$user=auth()->user();
$invoice=invoice::pull('user_id')->toArray();
if($user->admin | | in_数组($user->id,$invoice)){
返回$next($request);
}
return response()->json(['message'=>'Request not authorized.],401);
}
此外,您还可以在用户模型中创建与发票模型的关系:

公共功能发票()
{
返回$this->hasOne(发票::类);
}
然后,您可以使用以下关系简化中间件:

公共函数句柄($request,Closure$next,…$guards)
{
如果(auth()->user()->admin | | auth()->user()->has('invoice')){
返回$next($request);
}
return response()->json(['message'=>'Request not authorized.],401);
}
您必须在
app/Http/Kernel.php
中的
$routeMiddleware
数组下注册中间件:

protected$routeMiddleware=[
...
“发票用户”=>App\Http\Middleware\UserWithInvoiceMiddleware::class,
];
然后,您可以使用此中间件保护您的路由,在用户必须是管理员或拥有发票的路由中添加一个
->中间件('user-with-invoice')

Route::get('/example', ExampleController::class)->middleware('user-with-invoice');

定义用户表和发票表之间的关系。hasOne()关系适用于此?技术上是的,因为即使连接了一张发票,您的用例似乎也在授权。我可以使用此中间件隐藏刀片文件中的某些内容,如链接到某些功能吗?您可以使用中间件保护链接不被访问,但是你不能只用中间件来隐藏链接。非常感谢