Search code examples
phplaravellaravel-5laravel-validationlaravel-request

Merge 2 rules FormFequest for validate an update and store action in laravel5.5


I have 2 FormRequest classes (ReadersFormRequest, SocialMediaFormRequest) and I want to store and update a Reader. A Reader may have 0 or many social media accounts, so it's necessary to validate the request.

ReadersFormRequest

class ReadersFormRequest extends FormRequest
{
    public function rules()
    {
        return [
            'first_name'=>'required',
            'last_name'=>'required',
            'birthday'=>'required',
            'region'=>'required',
            'photo_url'=>'required',
            'support'=>'required',
            'riwayas_id'=>'required',
            'description'=>'required',
        ];
    }
}

SocialMediaFormRequest

 public function rules()
 {
    return [
        'url'=>'required|url',
        'title'=>'required'
    ];
 }

So I want to merge the SocialMediaFormRequest rules in ReadersFormRequest rules

I found a solution:

  • make SocialMediaFormRequest rules a static method and merge it in SocialMediaFormRequest rules

SocialMediaFormRequest

public static function rules()
{
    return [
        'url'=>'required|url',
        'title'=>'required'
    ];
}

ReadersFormRequest

public function rules()
{
    return array_merge(SocialMediaFormRequest::rules(),[
        'first_name'=>'required',
        'last_name'=>'required',
        'birthday'=>'required',
        'region'=>'required',
        'photo_url'=>'required',
        'support'=>'required',
        'riwayas_id'=>'required',
        'description'=>'required',
    ]);
}

I think the merge is correctly done, but in update controller when I call this ReadersFormRequest, I don't know what happens.

public function update(ReadersFormRequest $request, Readers $reader)
{
    // valid and update reader
    Readers::whereId($reader->id)->update([
        'first_name' => $request->validated()['first_name'],
        'last_name' => $request->validated()['last_name'],
        'photo_url' => $request->validated()['photo_url'],
        'birthday' => $request->validated()['birthday'],
        'region' => $request->validated()['region'],
        'support' => $request->validated()['support'],
        'riwayas_id' => $request->validated()['riwayas_id'],
        'description' => $request->validated()['description']
    ]);
    // For update their social media account links 
    foreach ($request->validated()['url'] as $key => $url)
    {

    }

    return redirect(route('readers.show',$reader));
}

When I PUT the reader form this controller is not called.


Solution

  • Alter your class to:

    class ReadersFormRequest extends FormRequest
    {
        public function rules()
        {
            return [
                'first_name'=>'required',
                'last_name'=>'required',
                'birthday'=>'required',
                'region'=>'required',
                'photo_url'=>'required',
                'support'=>'required',
                'riwayas_id'=>'required',
                'description'=>'required',
                'url'=>'required|url',
                'title'=>'required'
            ];
        }
    }
    

    or if you really want to use a class do:

    class ReadersFormRequest extends FormRequest
    {
        public function rules(SocialMediaFormRequest $social)
        { 
            $mediaRules = $social->rules();
            $rules = [
                'first_name'=>'required',
                'last_name'=>'required',
                'birthday'=>'required',
                'region'=>'required',
                'photo_url'=>'required',
                'support'=>'required',
                'riwayas_id'=>'required',
                'description'=>'required',
            ];
            return array_merge($rules,$mediaRules);
        }
    }