Home > Blockchain >  Why don't I get any validation errors in this invalid Laravel 8 form?
Why don't I get any validation errors in this invalid Laravel 8 form?

Time:03-27

I am making a blogging application with Laravel 8 and Bootstrap 5.

I run into a problem trying to validate my Add article form. It fails to validate, meaning that no error messages appear, even if the required form data is not filled.

In the ArticleController controller, I have:

namespace App\Http\Controllers\Dashboard;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use App\Models\ArticleCategory;
use App\Models\Article;
use Illuminate\Http\Request;

class ArticleController extends Controller
{
    
    private $rules = [
        'category_id' => 'required|exists:categories,id',
        'title' => 'required|string',
        'short_description' => 'required|string',
        'content' => 'required|longText'
    ];

    private $messages = [
        'category_id.required' => 'Please pick a category for the article',
        'title.required' => 'Please provide a title for the article',
        'short_description.required' => 'The article needs a short description',
        'content.required' => 'Please add content'
    ];
    
    public function categories() {
        return ArticleCategory::all();
    }

    public function add(Request $request) {
        // Pass the categories to the articles form
        return view('dashboard/add-article',
            ['categories' => $this->categories()]
        );

    // Validate form (with custom messages)
    $validator = Validator::make($request->all(), $this->rules, $this->messages);

    if ($validator->fails()) {
        return redirect()->back()->withErrors($validator->errors());
    }

    $fields = $validator->validated();

    // Data to be added
    $form_data = [
        'user_id' => Auth::user()->id,
        'category_id' => $fields['category_id'],
        'title' => $fields['title'],
        'slug' => Str::slug($fields['title'], '-'),
        'short_description' => $fields['short_description'],
        'content' => $fields['content'],
        'image' => $fields['image'],
        'featured' => $fields['featured']
    ];

    // Insert data in the 'articles' table
    $query = Article::create($form_data);

        if ($query) {
            return redirect()->route('dashboard.articles')->with('success', 'Article added');
        } else {
            return redirect()->route('dashboard.articles')->with('error', 'Adding article failed');
        }

    }

}

The form:

<form method="POST" action="{{ route('dashboard.articles.add') }}">
    @csrf
    <div >
            <label for="title" >{{ __('Title') }}</label>

            <div >
                    <input id="title" type="text" placeholder="Title"  name="title" value="{{ old('title') }}" autocomplete="title" autofocus>

                    @error('title')
                            <span  role="alert">
                                    <strong>{{ $message }}</strong>
                            </span>
                    @enderror
            </div>
    </div>

    <div >
            <label for="short_description" >{{ __('Short description') }}</label>

            <div >
                    <input id="short_description" type="text" placeholder="Short description"  name="short_description" value="{{ old('short_description') }}" autocomplete="short_description" autofocus>

                    @error('short_description')
                            <span  role="alert">
                                    <strong>{{ $message }}</strong>
                            </span>
                    @enderror
            </div>
    </div>

    <div >
        <label for="category" >{{ __('Category') }}</label>
    
        <div >
    
            <select name="category_id" id="category" >
                <option value="0">Pick a category</option>
                @foreach($categories as $category)
                    <option value="{{ $category->id }}">{{ $category->name }}</option>
                @endforeach
            </select>
                
    
                @error('category_id')
                        <span  role="alert">
                                <strong>{{ $message }}</strong>
                        </span>
                @enderror
        </div>
    </div>

    <div >
        <div >
                <p >Featured article?</p>
                <input  type="checkbox" name="featured" id="featured">
                <label  for="featured">{{ __('Toggle') }}</label>
        </div>
    </div>

    <div >
        <label for="image" >{{ __('Article image') }}</label>
    
        <div >
            <input type="file" name="image" id="file" value="{{ old('image') }}" >
    
            @error('image')
                <span  role="alert">
                    <strong>{{ $message }}</strong>
                </span>
            @enderror
        </div>
    </div>

    <div >
        <label for="content" >{{ __('Content') }}</label>

        <div >

            <textarea name="content" id="content"  placeholder="Content" cols="30" rows="6">{{ old('content') }}</textarea>

            @error('content')
                    <span  role="alert">
                            <strong>{{ $message }}</strong>
                    </span>
            @enderror
        </div>
    </div>
    
    <div >
            <div >
                    <button type="submit" >
                            {{ __('Save') }}
                    </button>
            </div>
    </div>
</form>

The routes:

// Article routes
Route::group(['prefix' => 'articles'], function() {
  Route::get('/', [ArticleController::class, 'index'])->name('dashboard.articles');
  Route::match(['get', 'post'],'/add', [ArticleController::class, 'add'])->name('dashboard.articles.add');
  Route::get('/delete/{id}', [ArticleController::class, 'delete'])->name('dashboard.articles.delete');
});

Why does my form fail to validate?

CodePudding user response:

Your public function add() starts with a return statement.

The rest of the code is irrelevant since you return from the function at this point.

  • Related