【发布时间】:2021-07-22 11:39:00
【问题描述】:
我在使用 livewire ( laravel ) 进行数据验证时遇到了一点问题。
我注意到,当我设置实时验证 (validateOnly()) 时,表单中输入的信息会实时验证。在这个级别上一切都很好。
但是当我点击按钮提交表单时(即使表单包含错误),该表单不幸被发送到我在 wire:submit 中定义的函数。
所以我的问题是:是否可以在提交表单后重新验证接收数据的 wire:submit 方法中的信息?如果是这样,我该怎么做?
PS:我尝试在我的 wire:submit 函数中设置验证方法,但没有任何反应。它阻止提交表单,但不会给我一个错误。
我的源代码:
<?php
class UserProfile extends Component
{
use WithFileUploads;
public $countries = [];
public $profile = [];
protected function rules() {
if ( !LivewireUpdateProfileRequest::authorize() ) {
return abort(403, "Your are not authorized to make this request !");
}
$rules = LivewireUpdateProfileRequest::rules();
if ( !empty($this->profile['phone']) ) {
$rules['profile.phone'] = [ 'required', 'phone_number:' . $this->profile['phone'] ];
}
return $rules;
}
public function mount()
{
$this->countries = Countries::all();
$this->profile = Auth::user()->toArray();
}
public function updateUserProfile()
{
$validatedData = $this->validate();
dd( $validatedData );
}
public function updated($key, $value)
{
$this->validateOnly($key);
}
public function render()
{
return view('livewire.user-profile');
}
}
HTML 源代码:
<form action="" method="POST" wire:submit.prevent="updateUserProfile">
<input name="profile.email" type="email" wire:model="profile.email" />
@error('profile.email') {{ $message }} @enderror
<input name="profile.phone" type="tel" wire:model="profile.phone" />
@error('profile.phone') {{ $message }} @enderror
</form>
这里是 LivewireUpdateProfileRequest 内容:
<?php
namespace App\Http\Requests\Web;
use Illuminate\Foundation\Http\FormRequest;
class LivewireUpdateProfileRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public static function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public static function rules()
{
return [
'profile' => ['required', 'array', 'size:10'],
'profile.firstname' => ['required', 'string'],
'profile.lastname' => ['required', 'string'],
'profile.email' => ['required', 'email'],
'profile.phone' => ['required', 'phone_number:33'],
'profile.gender' => ['required', 'gender'],
'profile.image' => ['sometimes', 'image', 'mimes:png,jpg,jpeg'],
'profile.address' => ['required', 'string'],
'profile.city' => ['required', 'string'],
'profile.country_id' => ['required', 'exists:countries,id'],
'profile.birth_at' => ['required', 'date', 'min_age:18'],
];
}
}
【问题讨论】: