0

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.

i alarmed alien
  • 9,412
  • 3
  • 27
  • 40
Haithem DISSEM
  • 74
  • 3
  • 12

2 Answers2

2

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);
    }
}
madalinivascu
  • 32,064
  • 4
  • 39
  • 55
  • i wana really use the class SocialMediaFormRequest and it don't work too even the controller don't work and error just same at refresh page no result – Haithem DISSEM Oct 26 '17 at 22:52
  • the problem no problem displayed but no accesses to the ReadersController – Haithem DISSEM Oct 27 '17 at 10:57
  • what do you mean by **no accesses to the ReadersController**? – madalinivascu Oct 27 '17 at 11:41
  • The given data was invalid.D:\Users\Haithem Dissem\Desktop\blog\vendor\laravel\framework\src\Illuminate\Foundation\Http\FormRequest.php#117Illuminate\Validation\ValidationException ------------------------------------ protected function failedValidation(Validator $validator) { throw (new ValidationException($validator)) ->errorBag($this->errorBag) ->redirectTo($this->getRedirectUrl()); } this is the exception – Haithem DISSEM Oct 27 '17 at 23:13
  • I solved the problem. It was the validation of SocialMediaFormRequest rules(). 'url'=>'required|url', ----------become----------> 'url'=>'required', – Haithem DISSEM Oct 28 '17 at 12:53
  • This way of doing requires having a **media**. Do you know a way that would allow **media** to be **null**? I ask the question because currently, even if **media is null**, it will call to the media request, which I don't want since it is null. – jeremie bergeron Jun 14 '22 at 17:57
0

This's how I handled it in similar situation:

public static function combineValidations($rules1, $rules2)
{
    if(!is_array($rules2)) return $rules1;

    foreach($rules2 as $key => $item)
    {
        if(!isset($rules1[$key]))
        {
            $rules1[$key] = $item;
        }else
        {
            $rules1[$key] .= '|'.$item;
        }
    }

    return $rules1;
}
mwafi
  • 3,946
  • 8
  • 56
  • 83