Как в laravel-livewire установить флэш-сообщение с ошибками проверки

С приложением laravel 7 / livewire 1.3 в форме входа я получил ошибки в недопустимой форме с кодом:

public function submit()
{
    $loginRules= User::getUserValidationRulesArray();
    $this->validate($loginRules);

и показывает сообщение об ошибке рядом с любым полем

Я хочу, чтобы при входе в систему не добавлялось флэш-сообщение и не читалось https://laravel.com/docs/7.x/validation

Я стараюсь сделать:

$request = request();
$loginRules= User::getUserValidationRulesArray('login');
$validator = Validator::make($request->all(), $loginRules);

if ($validator->fails()) {
    session()->flash('danger_message', 'Check your credentials !');
    return redirect()->to('/login');
}

Я получил флэш-сообщение, но ошибки проверки для любого поля потеряны.

Если я попытаюсь сделать:

$request = request();
$loginRules= User::getUserValidationRulesArray('login');
$validator = Validator::make($request->all(), $loginRules);

if ($validator->fails()) {
    session()->flash('danger_message', 'Check your credentials !');
    return redirect('/login')
        ->withErrors($validator)
        ->withInput();
}

и я получил ошибку:

Method Livewire\Redirector::withErrors does not exist.

в routes / web.php у меня есть:

Route::livewire('/login', 'login')->name('login');

ИЗМЕНЕНО: в приложении-компоненте / Http / Livewire / Login.php:

<?php

namespace App\Http\Livewire;

use App\User;
use Illuminate\Support\Facades\Validator;
use Livewire\Component;
use Auth;
use DB;
use App\Config;
use Cartalyst\Sentinel\Laravel\Facades\Sentinel;


class Login extends Component
{
    public $form= [
        'email'=>'[email protected]',
        'password'=> '111111',
    ];

    private $view_name= 'livewire.auth.login';


    public function submit()
    {

        $request = request();
        $loginRules= User::getUserValidationRulesArray('login');
        $validator = Validator::make($request->all(), $loginRules);

        if ($validator->fails()) {
            session()->flash('danger_message', 'Check your credentials !');
            return;
//            return redirect()->to('/login');
        }



        $user = Sentinel::findByCredentials(['email'    => $this->form['email']]);
        if (empty($user)) {
            session()->flash('danger_message', 'User "' . $this->form['email'] . '" not found !');
            ...

и шаблон resources / views / livewire / auth / login.blade.php:

<article >

    @include('livewire.common.alert_messages')

       <form class="form-login" wire:submit.prevent="submit">

        <div class="card">
                   @if ($errors->any())
                Check your login credentials
            @endif

                <ul>
                 @foreach ($errors->all() as $error)
                        <li>{{ $error }}</li>
                                          @endforeach
                </ul>

            <div class="card-body card-block">

                <h3 class="card-header">
                    <span class="spinner-border" role="status" wire:loading>
                        <span class="sr-only">Loading...</span>
                    </span>
                    Login
                    </h3>
                <h4 class="card-subtitle">Use your credentials</h4>

                <dl> <!-- email FIELD DEFINITION -->

                    <dt>
                        <label class="col-form-label" for="email">Email:<span class="required"> * </span></label>
                    </dt>
                    <dd>
                            <input
                                wire:model.lazy="form.email"
                                name="email"
                                id="email"
                                class="form-control"
                                placeholder="Your email address"
                                autocomplete=off
                                             >
                          @error('form.email')
                        <div class="validation_error">{{ clearValidationError($message,['form.'=>'']) }}</div> @enderror
                    </dd>
                </dl> <!-- <dt> email FIELD DEFINITION -->


                <dl> <!-- password FIELD DEFINITION -->
                    <dt>
                        <label class="col-form-label" for="password">Password:<span class="required"> * </span></label>
                    </dt>
                    <dd>
                         <input type="password"
                               wire:model.lazy="form.password"
                                   id="password"
                                   name="password"
                                   class="form-control"
                                   placeholder="Your password"
                                   autocomplete=off
                                                >
                          @error('form.password')
                        <div class="validation_error">{{ clearValidationError($message,['form.'=>'']) }}</div> @enderror
                    </dd>
                </dl> <!-- <dl> password FIELD DEFINITION -->

            </div> <!-- <div class="card-body card-block"> -->

            <section class="card-footer row_content_right_aligned">
                <button type="reset" class="btn btn-secondary btn-sm m-2">
                    Reset
                </button>
                <button type="submit" class="btn btn-primary btn-sm m-2 ml-4 mr-4 action_link">
                    Submit
                </button>
            </section>


        </div> <!-- <div class="card"> -->

    </form>
</article>

Какой способ действителен?

Заранее спасибо!


person Petro Gromovo    schedule 21.09.2020    source источник
comment
прочтите этот laravel-livewire.com/docs/1. x / и следуйте ему, немного отличается от Laravel   -  person Kamlesh Paul    schedule 21.09.2020
comment
Не уверен, за чем мне следовать? Должен ли я использовать validateOnly?   -  person Petro Gromovo    schedule 21.09.2020
comment
мимо кода компонента не в коде laravel   -  person Kamlesh Paul    schedule 21.09.2020


Ответы (2)


Прелесть Livewire заключается в том, что вам не обязательно перенаправлять, чтобы высветить сообщение, вы можете отображать сообщения, задав свойства вашего компонента и условно отображая их в вашем представлении. В этом конкретном случае логика уже доступна, вам просто нужно проверить объект ошибок, отображаемый при проверке.

По вашему мнению, все, что вам нужно сделать, это проверить @if ($errors->any()) - если это правда, выведите свое сообщение. Это функция Laravel, которую реализует Livewire. Когда какая-либо проверка не удается, генерируется и перехватывается исключение, и переменная $errors становится доступной вашему представлению. Это означает, что когда вы делаете $this->validate() и проверка не удалась, вы можете получить доступ к ошибкам в $errors.

<div>
    @if ($errors->any())
        Check your login credentials
    @endif 

    <form wire:submit.prevent="submit">
        <input type="text" wire:model="email">
        @error('email') <span class="error">{{ $message }}</span> @enderror
        
        <input type="password" wire:model="password">
        @error('password') <span class="error">{{ $message }}</span> @enderror
    
        <button type="submit">Submit</button>
    </form>
</div>

Используйте атрибут $rules для объявления правил, подтвердите эти правила с помощью $this->validate(), и Livewire сделает большую часть работы за вас. Вам не нужно возвращать перенаправления или использовать session()->flash(). Состояние сеанса не будет мигать, потому что вы не выполняете новую загрузку страницы.

class Login extends Component
{
    public $form = [
        'email' => '[email protected]',
        'password' => '111111',
    ];

    protected $rules;

    private $view_name = 'livewire.auth.login';

    public function submit()
    {
        $this->rules = User::getUserValidationRulesArray('login');
        $this->validate();

        // No need to do any more checks, $errors will now be updated in your view as the exception is thrown
        // Proceed with submitting the form
person Qirel    schedule 21.09.2020
comment
Я прокомментировал перенаправление в компоненте, но этот поток: if ($ errors- ›any ()) Проверьте ваши учетные данные для входа endif Не отображается. Похоже, что с установкой flash сообщение @error ('пароль') потеряно. - person Petro Gromovo; 21.09.2020
comment
Тогда вы, вероятно, делаете что-то еще странное, потому что простая проверка @if ($errors->any()) не влияет на директиву лезвия @error. Я только что протестировал его локально, и могу использовать оба одновременно. - person Qirel; 21.09.2020
comment
Мне нужно вместо блока @if ($ errors- ›any ()) с 1 предопределенным сообщением для отображения Flash-сообщения - person Petro Gromovo; 22.09.2020
comment
Используйте предоставленные атрибуты $rules и $this->validate() вместо того, чтобы писать свои собственные. См. Пример компонента. - person Qirel; 22.09.2020
comment
Но в этом случае поток автоматически останавливается на $ this- ›validate ([]); и я не могу установить вспышку в следующем ряду. И я не вижу никаких событий, запускаемых для установки вспышки в следующей строке. В этом и проблема, и зачем использовать Validator :: make ( - person Petro Gromovo; 22.09.2020
comment
@Qirel, если нам нужно получить сообщение об ошибке проверки в компоненте, как мы можем это сделать, прежде чем показывать их в поле зрения? - person DolDurma; 17.01.2021
comment
Спасибо за это, Qirel! Я также использую настраиваемый именованный пакет сообщений (например, notices) для отображения сообщений об успешном выполнении. Как бы вы реализовали что-то подобное? Я имею в виду, что ничего не проверено, это просто сообщение об успехе. - person ralphjsmit; 25.06.2021

Перед методом рендеринга вы можете проверить, есть ли в errorBag элементы:


    public function render()
    {
        if(count($this->getErrorBag()->all()) > 0){

             $this->emit('error:example');

        }
        return view('livewire-component-view');
    }

person amrography    schedule 24.11.2020