Laravel Auth :: hasUser всегда false в глобальной области видимости - PullRequest
1 голос
/ 16 февраля 2020

У меня есть следующий код в моей модели:

protected static function boot()
{
    parent::boot();

    static::addGlobalScope(new CompanyScope);
}

Вот мой CompanyScope:

class CompanyScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        \Log::info('apply');

        if (Auth::hasUser()) {
            \Log::info('auth');

            $builder->where($model->getTable() . '.company_id', company()->id);
        }
    }
}

В моем журнале я вижу только apply, я делаю не видите auth, и при этом не применяется область действия.

Почему?

1 Ответ

0 голосов
/ 16 февраля 2020

Я только что проверил то, что у вас здесь, за исключением того, что я использовал \Illuminate\Support\Facades\Log вместо \Log, и кажется, что он работает нормально, пока вы на самом деле тестируете его с аутентифицированным пользователем:

app / User. php

<?php

namespace App;

use App\Scopes\CompanyScope;

use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope(new CompanyScope);
    }
}

app / Scopes / CompanyScope. php

<?php

namespace App\Scopes;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use Illuminate\Database\Eloquent\Scope;

class CompanyScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        Log::info('apply');

        if (Auth::hasUser()) {
            Log::info('auth');

            $builder->where($model->getTable() . '.company_id', company()->id);
        }
    }
}

В моем контроллере я просто получаю пользователь с идентификатором 1:

/**
* Get landing view.
*
* @return \Illuminate\Http\JsonResponse
*/
public function index(): JsonResponse
{
    $user = User::find(1);

    return new JsonResponse([
        'user' => $user,
    ]);
}

и соответствующим тестом:

/**
 * @test
 */
public function global_scope()
{
    $this->actingAs($user = factory(User::class)->create(['id' => 1]));

    $this->assertTrue($user->exists);
    $this->assertAuthenticatedAs($user);

    $response = $this->get(route('home'));

    $response->assertExactJson([
        'user' => $user->toArray()
    ]);
}

После запуска теста мой файл журнала содержит:

[2020-02-16 14:18:59] testing.INFO: apply  
[2020-02-16 14:18:59] testing.INFO: auth 

Если вы попробуйте то же самое без входа пользователя в систему, тогда будет зарегистрировано только apply.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...