Php Laravel从blade指令复制查询
我使用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::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
做什么,因为这是实际执行任何工作的唯一方法。它从角色表中提取用户的角色,并检查用户是否具有给定的角色。这就是查询出现的地方,但它并没有真正改变任何事情。不知道为什么会被否决?这就是我一直在寻找的解决方案。重复查询已解决-谢谢。谢谢您的建议。我将进一步研究这一点,看看如何将其纳入最终解决方案。