在laravel

时间:2017-11-23 17:44:50

标签: php laravel laravel-5.4

我正在使用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,
            ],
        ],

2 个答案:

答案 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();