Tom Headifen
Tom Headifen

Reputation: 1996

Laravel 'required' rule not working on Request

I'm using laravel 5.5

I have a Request that I've built but the required rule is not working correctly.

Route

Route::get('v1/learning_centre/user/{userId}/course/list', 'API\LearningCentre@userCourses');

Controller

public function userCourses(GetUserCourses $request)
{
    $courses = User::findOrFail($request->userId)
                    ->courses()
                    ->get();

    return new CourseResourceCollection($courses);
}

Request

namespace App\Http\Requests\LearningCentre;

use Illuminate\Foundation\Http\FormRequest;

class GetUserCourses extends FormRequest {
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'userId' => 'required|integer'
        ];
    }

    /**
     * Get the error messages for the defined validation rules.
     *
     * @return array
     */
    public function messages()
    {
        return [
            'userId.required' => 'A User is required',
        ];
    } }

If I turn off the required rule I can get to the controller. If I have the required rule in the request I get a 302. I am passing in a valid userId in phpunit. Without the request rules my code works as intended.

Any ideas?

Upvotes: 0

Views: 699

Answers (1)

ceejayoz
ceejayoz

Reputation: 180136

You should be using route model binding to validate a required GET parameter in this situation, not a FormRequest class, which, as the name should indicate, are intended for form requests.

Your route:

Route::get('v1/learning_centre/user/{user}/course/list', 'API\LearningCentre@userCourses');

Your controller:

public function userCourses(User $user) {

If a user ID is missing (or an invalid one used), your controller will automatically throw a ModelNotFoundException, which Laravel by default returns as a 404.

Upvotes: 1

Related Questions