92440


### 前提

PHP/Laravel９を独学で学習しています。  
[ネット上の記事](https://b-risk.jp/blog/2022/08/laravel/#i-13:%7E:text=%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%EF%BC%81-,%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E5%AE%8C%E4%BA%86%E3%81%99%E3%82%8B,-%E3%81%95%E3%81%A6%E3%80%81%E6%AC%A1%E3%81%AF)を参考にTodoリスト開発→改造しています。  
記事ではコントローラーでバリデーションルールを記載していますが、学習のため、Request.phpでのバリデーションルールを作成したいと考えています。

### 発生している問題・実現させたい事

フォームの項目（title、remarks）にバリデーションをかけているのですが、完了ボタンを押した際にもバリデーション（タイトルは必ず指定してください。）がかかり、完了ボタンが押せません。

完了ボタンを押しても、バリデーションがかからないようにしたいです。  
StoreTaskRequest.phpでフォームの値で条件分岐させる方法が知りたいです。

### 該当のソースコード

バリデーションは、上記記事のとおりのコードではなくStoreTaskRequest.phpを作成しています。

[code]

    public function rules()
        {
            return [
                'title' => ['required', 'string', 'max:20'],
                'remarks' => ['nullable', 'string', 'max:50']
            ];
        }
    
[/code]

としており、Taskの編集ページでも上記ルールを使用しています。  
編集ページには完了ボタンがないため、完了フォームの値はnullになるので、  
完了フォームの値がnullならreturn以下のルールを適用させるという処理にしたいです。

[code]

    public function rules()
        {  
            if(完了フォームの値　=== 'null'){
                return [
                    'title' => ['required', 'string', 'max:20'],
                    'remarks' => ['nullable', 'string', 'max:50']
                ];
            }
        }
    
[/code]

という具合にしたいのですが、StoreTaskRequest.phpで完了フォームの値を取得する方法がわかりません。

教えていただけたら助かります。  
よろしくお願いいたします。


CC BY-SA 4.0
2022-11-02T05:27:49.683
91945
2022-11-29T05:19:21.287
55170
question
php laravel バリデーション
Laravel9　Todoリスト　Recquest.phpでフォームの値を取得→値によって条件分岐したい


一番正しい対応はFormRequestを使い回さない。  
使う場面が違うなら別のFormRequestを作る。  
今は似てるから使い回せそうに見えても項目が増えていったら分かりにくくなる。

それでも使い回す場合  
FormRequestはRequestを継承しているのでFormRequest内ではRequestの機能を全部使える。

[code]

            if($this->has('')){
                return [
                    'title' => ['required', 'string', 'max:20'],
                    'remarks' => ['nullable', 'string', 'max:50']
                ];
            }
    
[/code]

この$thisは$requestと同じなのでこれで好きなように判定すればいい。


CC BY-SA 4.0
2022-11-26T05:12:51.010
92440
2022-11-26T05:12:51.010
21074
91945
answer


回答ありがとうございます。

上記質問について、しばらく分からないままだったので、結局参考にした記事の要領（Controllerの中でバリデーションを行う）で

[code]

    if ($request->status === null) {
          $rules = [
            'title' => ['required', 'string', 'max:20']
            'remarks' => ['nullable', 'string', 'max:50']
          ];  
      }
    
[/code]

としていました。

[code]

    if($this->has('status') === null){
    とか
    if ($this->status === null) {
       return [
              'title' => ['required', 'string', 'max:20'],
              'remarks' => ['nullable', 'string', 'max:50']
       ];
    }
    
[/code]

などで試してみようと思います。

ありがとうございました。


CC BY-SA 4.0
2022-11-29T05:19:21.287
92490
2022-11-29T05:19:21.287
55170
91945
answer