Правило file
Правило file в Livewire применяется в методе rules
для проверки загруженных через wire:model файлов.
Оно гарантирует, что переданное значение - это экземпляр
TemporaryUploadedFile, и файл был успешно загружен.
В отличие от стандартного правила Laravel, Livewire версия
учитывает особенности временных загрузок.
Синтаксис
use Livewire\Attributes\Rule;
#[Rule('file|max:1024|mimes:jpg,png')]
public $photo;
Или в методе rules:
public function rules()
{
return [
'photo' => 'file|max:1024|mimes:jpg,png',
];
}
Пример
Давайте создадим компонент для загрузки аватара с проверкой на тип изображения и максимальный размер:
<?php
namespace App\Livewire;
use Livewire\Component;
use Livewire\WithFileUploads;
use Livewire\Attributes\Rule;
class AvatarUpload extends Component
{
use WithFileUploads;
#[Rule('file|max:2048|mimes:jpg,jpeg,png')]
public $avatar;
public function save()
{
$this->validate();
$path = $this->avatar->store('avatars', 'public');
session()->flash('message', 'Avatar uploaded: ' . $path);
}
public function render()
{
return view('livewire.avatar-upload');
}
}
?>
<form wire:submit.prevent="save">
<input type="file" wire:model="avatar">
@error('avatar') <span>{{ $message }}</span> @enderror
<button type="submit">Upload</button>
</form>
@if (session()->has('message'))
<div>{{ session('message') }}</div>
@endif
Результат выполнения кода при успешной загрузке:
<form>
<input type="file">
<button type="submit">Upload</button>
</form>
<div>Avatar uploaded: avatars/abc123.jpg</div>
Результат выполнения кода при ошибке валидации:
<form>
<input type="file">
<span>The avatar must be a file of type: jpg, jpeg, png.</span>
<button type="submit">Upload</button>
</form>
Пример
Давайте разрешим загрузку только PDF-файлов
размером не более 5 МБ с проверкой в методе rules:
<?php
namespace App\Livewire;
use Livewire\Component;
use Livewire\WithFileUploads;
class FileUpload extends Component
{
use WithFileUploads;
public $document;
public function rules()
{
return [
'document' => 'file|max:5120|mimes:pdf',
];
}
public function upload()
{
$validated = $this->validate();
$path = $validated['document']->store('documents', 'public');
$this->dispatch('uploaded', path: $path);
}
public function render()
{
return view('livewire.file-upload');
}
}
?>
<div>
<input type="file" wire:model="document">
@error('document') <span>{{ $message }}</span> @enderror
<button wire:click="upload">Upload PDF</button>
</div>
Результат выполнения кода:
<div>
<input type="file">
<button wire:click="upload">Upload PDF</button>
</div>
Смотрите также
-
трейт
WithFileUploads,
который добавляет поддержку загрузки файлов -
метод
store,
который сохраняет загруженный файл -
правило
image,
которое проверяет, что файл является изображением -
правило
max,
которое ограничивает размер загружаемого файла