【问题标题】:Unique validation of a substring in LaravelLaravel 中子字符串的唯一验证
【发布时间】:2016-07-28 21:38:16
【问题描述】:

我将filenames + their extensions 存储在files 表的filename 列下。我的问题是,由于 $request 对象中只存在名称而没有相应的扩展名,因此如果不先修改输入数据,我就无法使用唯一验证规则来验证文件名。示例:

// . . .
$this->validate($request, [
    //   Suppose the name of uploaded file is 'file'.
    // The below rule will NEVER fail, because in the 
    // database, similar file will be stored as 'file.txt',
    // thus 'file' != 'file.txt'
    'filename' => 'unique:files'
]);
// . . .

有没有办法验证文件名而忽略它在数据库中的后缀(扩展名)?

【问题讨论】:

  • 您在代码中的什么位置为文件名附加了扩展名?
  • @MarcoAurélioDeleu 验证通过后,我连接文件名及其扩展名并将它们存储在数据库中。这是一段相当强大的代码,真的需要在这里发布吗?
  • 这取决于,我可能会为您提供解决方案,但这取决于您更改策略,这意味着在验证后停止附加扩展名并在之前执行。
  • 对不起,我没有注意到您使用的是$this->validate 方法而不是Form Request 验证。鉴于这一现实,您不能在调用 $this->validate 之前而不是之后添加扩展名吗?

标签: php validation laravel laravel-5 laravel-validation


【解决方案1】:

您可以尝试在您的Request 类中覆盖all() 方法,并在验证之前而不是之后附加您的扩展。应该是这样的

public function all() {
    $data = parent::all();           // Get all the data in your request
    $data['filename'] .=  '.txt';    // Concatenate the file extension

    return $data;           // DONT FORGET TO RETURN THE CHANGED DATA
}

现在,您的规则将正常工作,因为它会搜索带有 扩展名的文件。 提醒:您需要停止在 Controller 或您使用的任何地方添加扩展程序,否则您将得到filename.txt.txt 并返回到第 1 格。

就个人而言,我觉得在我喜欢的时候重写all() 方法有点麻烦,所以我有以下特点

trait SanitizeRequest {

    protected $sanitized = false;

    public function all() {
        return $this->sanitize(parent::all());
    }

    protected function sanitize(array $inputs) {
        if ($this->sanitized) return $inputs;

        foreach ($inputs as $field => $value) {
            if (method_exists($this, $field))
                $inputs[$field] = $this->$field($value);
        }
        $this->replace($inputs);
        $this->sanitized = true;
        return $inputs;
    }

}

这个特性允许我在验证之前使用字段名称编写自定义方法。使用这种方法可以让你有这样的方法

class YourRequest extends Request {

    use SanitizeRequest;

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize() {
        return true;
    }

    ...

   protected function filename($value) {
       return $value . '.txt';
   }

}

【讨论】:

  • 你是MVP。感谢您提供如此巧妙的解决方案!
猜你喜欢
  • 1970-01-01
  • 2019-03-24
  • 2018-01-03
  • 1970-01-01
  • 2014-07-16
  • 2018-07-29
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
相关资源
最近更新 更多