我通过使用 Blade 指令得到重复的查询。我正在检查用户的角色,然后在表中显示数据,因此查询会一遍又一遍地重复,从而减慢了应用程序的速度。
我已经注册了一个 Blade 服务提供商,在引导方法中我有以下内容:
Blade::if('admin', function () {
return auth()->check() && auth()->user()->isAdmin();
});
在我的用户模型中:
public function isAdmin()
{
return $this->hasRole('admin');
}
在我看来:
@admin
...
@endadmin
我已经查看了缓存查询,但我没有看到为特定用户执行此操作的方法,这正是我在这种情况下所需要的。这个问题有标准的解决方案吗?
最佳答案
我建议你使用一个类的实例,比如 AccessService
,它充满了常见的属性,比如 is_admin
或 user_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
中将服务注册为单例。