Search code examples
phplaravellaravel-livewire

Method Livewire\Redirector::withInput does not exist. in laravel


I am using live wire and when I try to validate the form it say

Method Livewire\Redirector::withInput does not exist.

and this is my code

Posts.php
<?php

namespace App\Http\Livewire;

use Livewire\Component;
use App\Models\Post;

class Posts extends Component
{
    public $title;
    public $content;

    public function hydrate(){
        $this->validate([
            'title' => 'required',
            'content' => 'required'
        ]);
    }

    public function save(){
        $data = [
            'title' => $this->title,
            'content' => $this->content,
            'user_id' => Auth()->user()->id
        ];

        Post::create($data);
        $this->cleanVars();
    }

    private function cleanVars(){
        $this->title = null;
        $this->content = null;
    }

    public function render()
    {
        return view('livewire.posts');
    }
}

livewire view

<div>
    <label>Title</label>
    <input wire:model="title" type="text" class="form-control" />
    @error('title')
        <p class="text-danger">{{ $message }}</p>
    @enderror
    <label>Content</label>
    <textarea wire:model="content" type="text" class="form-control"></textarea>
    @error('content')
    <p class="text-danger">{{ $message }}</p>
    @enderror
    <br />
    <button wire:click="save" class="btn btn-primary">Save</button>
</div>

also I putted this view in home.blade.php

    @extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">{{ __('Dashboard') }}</div>

                <div class="card-body">
                    @livewire('posts')
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Solution

  • Really you need to fix the header of this question, is repeating the same and you're missing something there to the community. I see in your code this and I dislike this use

    public function hydrate(){
      $this->validate([
         'title' => 'required',
         'content' => 'required'
      ]);
    }
    

    I mean, this validation running on every hydration isn't a good approach of this. Instead, declare the rules

    protected $rules = [// rules here];
    
    //or
    
    public function rules()
    {
       return [
         //rules here
       ];
    }
    

    then you can validate the entries, for example on real-time validation using the validateOnly method inside the updated()

    public function updated($propertyName)
    {
      $this->validateOnly($propertyName, $this->rules());
    }
    

    or just use it in the save method

    public function save()
    {
       $this->validate();  // in the protected $rules property
        // or
       Post::create($this->validate());
    }