Я только что проверил то, что у вас здесь, за исключением того, что я использовал \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
.