我通过使用 Blade 指令得到重复的查询。我正在检查用户的角色,然后在表中显示数据,因此查询会一遍又一遍地重复,从而减慢了应用程序的速度。

我已经注册了一个 Blade 服务提供商,在引导方法中我有以下内容:

Blade::if('admin', function () {
    return auth()->check() && auth()->user()->isAdmin();
});

在我的用户模型中:
public function isAdmin()
{
    return $this->hasRole('admin');
}

在我看来:
@admin
    ...
@endadmin

我已经查看了缓存查询,但我没有看到为特定用户执行此操作的方法,这正是我在这种情况下所需要的。这个问题有标准的解决方案吗?

最佳答案

我建议你使用一个类的实例,比如 AccessService ,它充满了常见的属性,比如 is_adminuser_role 。将其填入一个 http 中间件,然后使用。当然,最好用缓存来扩展它。

<?php

namespace App\Services;

use App\User;

class AccessService{

    private $user;

    private $isAdmin;


    /**
     * @param User $user
     */
    public function setUser(User $user) {
        $this->user = $user;
        $this->isAdmin = $user->isAdmin();
    }


    /**
     * @return boolean
     */
    public function isAdmin(){
        return $this->isAdmin;
    }

}

服务填充了一个中间件 app\Http\Middleware\Access.php
<?php

namespace App\Http\Middleware;

use App\Services\AccessService;
use Closure;
use Auth;

class Access {

    public function handle($request, Closure $next)
    {
        $accessService = resolve(AccessService::class);

        # current user
        $user = Auth::user();

        if($user) {
            $accessService->setUser($user);
        }

        return $next($request);
    }
}

...在 app\Http\Middleware\Kernel.php 中注册
'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \App\Http\Middleware\Access::class, // here, right after StartSession
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

所以你只需使用 AccessService 扩展你的 Blade :
use App\Services\AccessService;
...
Blade::if('admin', function () {
    return resolve(AccessService::class)->isAdmin();
});

或者您可以将服务注入(inject) Blade 模板 @inject('accessService', 'App\Services\AccessService') 并像 @if($accessService->isAdmin()) 一样使用它

不要忘记在 AppServiceProvider.php 中将服务注册为单例。

10-07 15:32