检查从CSRF生成令牌的表单收到的数组是否为空

时间:2018-09-21 15:50:52

标签: php laravel

由于我使用的形式是csrf,因此在请求函数中传递的数组$data永远不会为空。 如何解决此问题,以便在提交表单而未填写任何输入字段的情况下,我得到“数据为空”?

<form action="{{url('/userdata')}}" method="POST">
    @csrf
    <div class="form-group">
        <label for="name">Name:</label>
        <input type="text" class="form-control" name="name">
    </div>
    <button type="submit" class="btn btn-default">Submit</button>
</form>

public function userdata(Request $request){
    $data=$request ->all();
    if(!empty($data)){
      echo "data is filled";
    }else{
      echo "data is empty";
    }
}

3 个答案:

答案 0 :(得分:0)

对不起,我在第一个答案上误解了您的问题。即使输入元素为空,也将始终为页面上的输入元素提交值。正确的方法是创建一个request validation

创建类似此类的东西,尽管我确信它更整洁;)

<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StoreUserdata extends FormRequest {
    public function authorize() {return true;}
    public function rules() {
        return ["name" => ["required", "max:64"]];
    }
}

然后编辑控制器方法的签名,以便与其期望Request而不是寻找您的验证类(不要忘记上面的use语句):

public function userdata(StoreUserdata $request){
// ....
}

现在,如果name输入为空或太长,您的请求将失败。有a lot of possible validation rules

答案 1 :(得分:0)

如果您不希望表单为空,则可以在输入字段中使用必填。

<form action="{{url('/userdata')}}" method="POST">
    @csrf
    <div class="form-group">
        <label for="name">Name:</label>
        <input type="text" class="form-control" name="name" required>
    </div>
    <button type="submit" class="btn btn-default">Submit</button>
</form>

否则,如果name是您唯一的字段,则可以执行以下操作:

public function userdata(Request $request){
    $data = $request->except(["_token"]);
    if($data['name'] != ""){
      echo "data is filled";
    } else {
      echo "data is empty";
    }
}

答案 2 :(得分:0)

您可以使用get()方法:

public function userdata(Request $request){
    $data = $request->get("_token");
    if(!empty($data)){
      echo "data is filled";
    } else {
      echo "data is empty";
    }
}