Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel从blade指令复制查询_Php_Mysql_Laravel_Performance - Fatal编程技术网

Php Laravel从blade指令复制查询

Php Laravel从blade指令复制查询,php,mysql,laravel,performance,Php,Mysql,Laravel,Performance,我使用Blade指令时收到重复的查询。我正在检查一个用户的角色,然后在表中显示数据,因此查询会一次又一次地重复,从而减慢应用程序的速度 我已经注册了刀片服务提供商,在引导方法中,我有以下内容: Blade::if('admin', function () { return auth()->check() && auth()->user()->isAdmin(); }); 在我的用户模型中: public function isAdmin() {

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

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

Blade::if('admin', function () {
    return auth()->check() && auth()->user()->isAdmin();
});
在我的用户模型中:

public function isAdmin()
{
    return $this->hasRole('admin');
}
在我看来:

@admin
    ...
@endadmin

我已经研究了缓存查询,但是我没有看到为特定用户缓存查询的方法,这正是我在本例中所需要的。这个问题有标准的解决方案吗

我建议将他们的角色存储在缓存中的键中,如
user:role:{user\u id}

如果您正在寻找一种比默认使用的文件系统更高效的缓存解决方案,那么您可以使用Redis

如果您订阅了Laracasts,Redis上有一个很棒的课程:


否则,请查看。Laravel很容易支持Redis,这使得使用Redis变得轻而易举。

我建议您使用一个类的实例,如
AccessService
,该类中填充了常见属性,如
is\u admin
user\u 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\Kernel.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);
    }
}
'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
扩展刀片:

use App\Services\AccessService;
...
Blade::if('admin', function () {
    return resolve(AccessService::class)->isAdmin();
});
或者,您可以将服务注入刀片模板
@inject('accessService','App\Services\accessService')
,并像
@if($accessService->isAdmin())


别忘了在
AppServiceProvider.php

中将服务注册为单例,您如何观察查询列表
DB::enableQueryLog()
?我正在使用barryvdh的Laravel调试栏,
hasRole
做什么,因为这是实际执行任何工作的唯一方法。它从角色表中提取用户的角色,并检查用户是否具有给定的角色。这就是查询出现的地方,但它并没有真正改变任何事情。不知道为什么会被否决?这就是我一直在寻找的解决方案。重复查询已解决-谢谢。谢谢您的建议。我将进一步研究这一点,看看如何将其纳入最终解决方案。