【问题标题】:Check if field exists in Input during validation using Laravel在使用 Laravel 进行验证期间检查输入中是否存在字段
【发布时间】:2013-07-01 07:12:44
【问题描述】:

我想确保某些字段作为表单的一部分发布,但我不介意某些字段是否为空值。

“必需”验证规则不起作用,因为我很乐意接受空字符串。我尝试了以下方法,但由于从未发送过“address2”字段,因此验证器不会对其进行处理。

有什么想法吗?

$rules = array(
     'address2' => 'attribute_exists'
);



class CustomValidator extends Illuminate\Validation\Validator {

    public function validateAttributeExists($attribute, $value, $parameters)
    {
        return isset($this->data[$attribute]);
    }
}

【问题讨论】:

  • 你到底想做什么?您正在检查自定义代码中的 isset,而不是您可以使用 required 吗?
  • 您是否有一组特定的值应该与“address2”匹配? Laravel 有很多验证规则,对于像 address2 这样简单的东西,我不确定你是否需要自定义验证。
  • 很抱歉,我可能没有正确解释自己。目前不可能使用任何现有的验证规则来检查 $_POST[attribute] 是否存在,但允许空字符串作为其值。我想接受空字符串,但检查变量“address2”是否在发布请求中。我在上面创建自定义验证规则的尝试似乎不起作用。当然,我可以检查它是否在代码中设置,但在执行任何其他逻辑之前,我会尝试使用验证规则保持干净。

标签: validation laravel laravel-4 isset


【解决方案1】:

您可以使用Input::has('address2') 检查地址2 输入名称是否发布了某些内容。看例子:

if(Input::has('address2')) {
    // Do something!
}

【讨论】:

    【解决方案2】:

    在 Laravel 5 中,

    if($request->has('address2')){
      // do stuff
    }
    

    【讨论】:

      【解决方案3】:

      你应该像这样制作自定义验证器。

      use Symfony\Component\Translation\TranslatorInterface;
      
      class CustomValidator extends Illuminate\Validation\Validator {
      
          public function __construct(TranslatorInterface $translator, $data, $rules, $messages = array())
          {
              parent::__construct($translator, $data, $rules, $messages);
      
              $this->implicitRules[] = 'AttributeExists';
          }
      
          public function validateAttributeExists($attribute, $value, $parameters)
          {
              return isset($this->data[$attribute]);
          }
      }
      

      这将使 AttributeExists 无需使用 require 即可工作。有关此的更多说明。当您想创建新的验证器规则时。如果你没有在 $implicitRules 中设置它,那么如果你在它之前不使用 require 规则,那么该方法将无法正常工作。您可以在 laravel 源代码中找到更多信息。

      【讨论】:

        【解决方案4】:

        当您提交表单时,每个字段都已发布,事实上,如果您将某些字段留空,则该字段值为 null 或空。只需检查一次 POST 参数,在 firefox 中打开 firebug 控制台并提交表单,然后检查 post 参数。既然要接受空字符串,那么任何规则有什么用?

        否则你可以这样做

        $addr2=Input::get('address2');
        if(isset($addr2)){
         //do here whatever you want
        }else{
         //do something else
         $addr2='';//empty string
        }
        

        【讨论】:

        • 嗨拉胡尔,这在技术上是不正确的。用户可以通过编辑 DOM 手动从 post 请求中删除字段。我对此不太担心,但希望将其用作 API 的一部分。如果未发送该字段,我希望验证失败。如果字符串已发送,但为空,则应该通过。
        • 您必须按照我上面所说的手动执行此操作,如果 isset($addr2) 为空或未发送,则将返回 false。
        • 太遗憾了,因为我最好使用 Laravel 验证。
        • Laravel 验证工作正常,但我认为没有任何此类验证可用或将确保它是必需的但为空......
        【解决方案5】:

        实际上,Laravel 有一个方法可以验证属性是否存在,即使没有填充。

        $rules = [
           'something' => 'present'
        ];
        

        所有的验证规则都存储在Validator类(/vendor/laravel/framework/src/Illuminate/Validation/Validator.php)中,你可以检查每个规则的实现,即使没有记录的规则。

        【讨论】:

        • 可以添加参考吗?除了:有时验证规则。
        猜你喜欢
        • 2015-01-02
        • 1970-01-01
        • 1970-01-01
        • 2021-11-13
        • 1970-01-01
        • 2017-08-10
        • 1970-01-01
        • 2016-12-11
        • 2015-04-29
        相关资源
        最近更新 更多