Метод withoutLazyLoading
Метод withoutLazyLoading класса Livewire предназначен для использования в тестовой среде.
Он отключает ленивую загрузку (lazy loading) для всех отношений Eloquent в рамках текущего теста.
Это полезно для предотвращения непредвиденных запросов к базе данных и выявления проблем N+1.
Метод не принимает параметров и возвращает тот же экземпляр класса Livewire для цепочки вызовов.
Синтаксис
<?php
Livewire::withoutLazyLoading();
?>
Пример
Давайте протестируем компонент, который выводит список статей с авторами. Без отключения ленивой загрузки тест может пройти, но в реальности возникнут лишние запросы.
<?php
namespace App\Livewire;
use Livewire\Component;
use App\Models\Article;
class Articles extends Component
{
public $articles;
public function mount()
{
$this->articles = Article::all();
}
public function render()
{
return view('livewire.articles');
}
}
?>
<div>
@foreach ($articles as $article)
<div>
<h3>{{ $article->title }}</h3>
<p>{{ $article->author->name }}</p>
</div>
@endforeach
</div>
<?php
namespace Tests\Feature\Livewire;
use Tests\TestCase;
use Livewire\Livewire;
use App\Livewire\Articles;
use App\Models\Article;
use App\Models\User;
class ArticlesTest extends TestCase
{
public function test_articles_are_displayed()
{
$author = User::factory()->create(['name' => 'John Doe']);
Article::factory()->create([
'title' => 'First Article',
'author_id' => $author->id
]);
Livewire::withoutLazyLoading();
$component = Livewire::test(Articles::class);
$component->assertSee('First Article');
$component->assertSee('John Doe');
}
}
?>
Результат выполнения кода:
OK (1 test, 2 assertions)
Пример
Рассмотрим ситуацию, когда нужно убедиться, что в компоненте не происходит лишних запросов к базе данных.
Метод withoutLazyLoading поможет обнаружить такие проблемы.
<?php
namespace App\Livewire;
use Livewire\Component;
use App\Models\User;
class Users extends Component
{
public $users;
public function mount()
{
$this->users = User::with('profile')->get();
}
public function render()
{
return view('livewire.users');
}
}
?>
<div>
@foreach ($users as $user)
<div>{{ $user->name }} - {{ $user->profile->bio }}</div>
@endforeach
</div>
<?php
namespace Tests\Feature\Livewire;
use Tests\TestCase;
use Livewire\Livewire;
use App\Livewire\Users;
use App\Models\User;
use App\Models\Profile;
class UsersTest extends TestCase
{
public function test_users_without_lazy_loading()
{
$user = User::factory()->create(['name' => 'Jane Doe']);
Profile::factory()->create([
'user_id' => $user->id,
'bio' => 'Software Developer'
]);
Livewire::withoutLazyLoading();
$component = Livewire::test(Users::class);
$component->assertSee('Jane Doe');
$component->assertSee('Software Developer');
}
}
?>
Результат выполнения кода:
OK (1 test, 2 assertions)
Если бы в компоненте использовалась ленивая загрузка, тест с withoutLazyLoading завершился бы ошибкой,
что помогло бы вовремя обнаружить проблему производительности.