Search code examples
phplaravellaravel-validation

How to use if/else in request class in laravel


i using only one page for "create ads page".

How to use multiple Validation Rules for query('type')?

ads.blade.php

@if ($request->query('type') == 'text')

   //fields

@elseif($request->query('type') == 'post')

   //fields

@elseif($request->query('type') == 'banner')

   //fields

@endif

AdsRequest.php

public function rules(Request $request)
{

    //this if not work. how to resolve?

    if ($request->query('type') == 'text'){
        return [
            'title'  => ['required','max:255', Rule::unique('ads')->ignore($this->route('ad'))],
            'url' => 'required',
            'type' => 'required|in:text,banner,post,sidebar',
            'status' => 'nullable',
            'btn' => 'nullable',
            'pic' => 'nullable',
            'description' => 'required',
        ];
    }
}

How to use multiple Validation Rules for query('type')?


Solution

  • Inside a request class, you can access the received data by the all() method.

    $data = $this->all();
    $type = isset($data['type'])? $data['type'] : null;
    
    switch($type) {
         case "text": 
            return [
               'url' => 'required'
            ]
    }
    

    Note that what you return in the rules() method is a normal PHP array that can be a merge of different arrays. You may have some rules that are regardless of this type field.

    $commonRules = [
       'title' => 'required',
       'email' => 'required|email',
    ];
    $specificRules = [];
    
    $data = $this->all();
    $type = isset($data['type'])? $data['type'] : null;
    
    switch($type) {
         case "text": 
            $specificRules = [
               'url' => 'required',
            ];
            break;
    
         case "foo":
            $specificRules = [
                'btn' => 'nullable',
            ];
            break;
    }
    
    return array_merge($commonRules, $specificRules);