php - Laravel 从 blade 指令复制查询

标签 php mysql laravel performance

我在使用 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 这样的公共(public)属性。填入一个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 中将服务注册为单例。

关于php - Laravel 从 blade 指令复制查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47064596/

相关文章:

mysql - 将 Excel 值与 SQL 表 If 语句进行比较。

php - 试图访问 laravel 集合之外的变量-> 每个

laravel - 如何在 Laravel + Vue js 项目中计算日期之间

javascript - JQuery根据输入构造选择框

javascript - Yii Ajax 在 LimeSurvey 插件环境中返回整个网页。为什么?

php - 试图获取非对象的属性,laravel 5?

laravel - 如何检查模型的附加项是否发生变化?

php - Laravel 5.5——经过身份验证的用户和 guest 用户的单独表

python - 将逗号分隔值从 mysql 加载到 python 中的数据框

php - 日期年份错误