我正在使用laravel 5.4 并在我的应用程序中添加了一个名为website
的新警卫,我做了所有必需的事情。
但我遇到的一个问题是,默认和website
后卫之间共享了一些观看次数。例如,当我想显示当前登录的用户时,我使用了这个:
<div class="pull-left info">
@if(Auth::guard('website')->check())
<p>{{Auth::guard('website')->user()->name}} Website</p>
@elseif (Auth::check())
<p>{{Auth::user()->name}}</p>
`@endif
<a href="#"><i class="fa fa-circle text-success"></i> Online</a>
</div>
这只是我必须检查哪个警卫登录的地方,这是非常困难,耗时和肮脏的方式。
另一方面,两个警卫的一些操作是相同的。例如,有一个bannerController
商店方法,可以像这样为它们保存一些横幅模型(当然这个例子只针对website
后卫编写,你可以看到):
public function store($website,StoreBannerAds $request)
{
$allData = $request->all();
$website = Auth::guard('website')->user();
$ads = $website->banner_ads()->create($allData);
$result = ['success' => true, 'generated_id' => $ads->banner_ads_id];
return $result;
}
在这种情况下,如果我想为登录用户的默认用户存储一些横幅,我应该使用if ()
或完全另一种商店方法:
public function store($website,StoreBannerAds $request)
{
$allData = $request->all();
if (Auth::guard('website')->check()) {
$model = Auth::guard('website')->user();
} else if (Auth::check()){
$model = Auth::user();
}
$ads = $model->banner_ads()->create($allData);
$result = ['success' => true, 'generated_id' => $ads->banner_ads_id];
return $result;
}
我想知道是否有任何干净和适当的方法可以做到这一点或者我必须使用这种方法吗?
更新:
我之前在auth.php配置文件中更改的是:
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'website' => [
'driver' => 'session',
'provider' => 'websites',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'websites' => [
'driver' => 'eloquent',
'model' => App\Website::class,
]
],
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_resets',
'expire' => 60,
],
],
答案 0 :(得分:1)
我从你的解释中得不到。但是,根据我的理解,我确实有一点解决方案。例如,使用helpers
。
if (! function_exists('auth_user')) {
function auth_user($guard = 'website', $attr = null, $force = false)
{
$user = auth($guard)->check()
? auth($guard)->user()
: $force && auth()->check()
? auth()->user()
: null;
return $user
? $attr
? $user->$attr
: $user
: null;
}
}
然后你可以像这样使用它:
// get name of the user
$name = auth_user('website', 'name');
// get the user
$user = auth_user()
PS。 如果用户未经过身份验证,您认为怎样? $model
的价值是多少?你的例子很奇怪。
使用这种方法,至少可以简化代码。
@if ($name = auth_user('website', 'name'))
<p>{{ $name }} Website</p>
@elseif ($name = auth_user(null, 'name')) // or auth_user('website', 'name', true)
<p>{{ $name }}</p>
@endif
和
// force get user data although `website` guard fails
$model = auth_user('website', null, true);
答案 1 :(得分:1)
您只需要点击默认防护来获取用户。 Auth::user()
将使用当前的默认警卫。
如果您始终在默认auth
中间件后面有任何需要经过身份验证的用户的路由,则默认防护应该是获取用户的正确保护。如果路由不在auth
中间件后面并且用户当前是访客,那么调用后卫check
并不重要。
Request
对象也可以访问当前用户。无论后卫$request->user()
应该给你当前的用户。
在警卫呼叫check
或询问AuthManager
默认警卫是什么时,可以检查使用了什么警卫。
一些选项:
@if (Auth::check())
{{ Auth::user()->name }}
@if (Auth::getDefaultDriver() == 'website')
Website
@endif
@endif
OR
@if (Auth::check())
{{ Auth::user()->name }}
@if (Auth::guard('webiste')->check())
Website
@endif
@endif
OR(如果在5.5上)
@auth
{{ Auth::user()->name }}
@auth('website')
Website
@endauth
@endauth
将线条略微缩小。
$model = $request->user();
// or
$model = Auth::user();