2016-07-28 2 views
0

Я храню filenames + their extensions под filename столбец в таблице files. Моя проблема заключается в том, что с только имя присутствует в объекте $request без соответствующего расширения. Я не могу проверить имя файла с помощью уникального правила проверки, не вставляя сначала входные данные. Пример:Уникальная проверка подстроки в Laravel

// . . . 
$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' 
]); 
// . . . 

Есть ли способ проверить имя файла, игнорируя его суффикс (расширение) в базе данных?

+0

В каком коде вы добавляете расширение для имени файла? –

+0

@ MarcoAurélioDeleu после прохождения проверки, я объединяю имя файла и его расширение и сохраняю их в базе данных. Это довольно мудрый фрагмент кода, действительно ли это нужно, чтобы его можно было разместить здесь? –

+0

Это зависит от того, у меня может быть решение для вас, но оно зависит от вас, меняя стратегию, а это означает, что вы прекратите добавление расширения после проверки и сделайте это до. –

ответ

1

Вы можете попробовать переопределить метод all() в вашем Request классе и добавьте ваше расширение Перед проверкой, а не после. Это было бы что-то вроде этого

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 
} 

Теперь ваше правило будет работать должным образом, потому что он будет искать файл с расширения. Напоминание: Вам нужно прекратить добавление расширения в контроллере или в зависимости от того места вы используете, чтобы сделать это, в противном случае вы будете в конечном итоге с 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'; 
    } 

} 
+0

Вы - MVP. Спасибо за такое опрятное решение! –

Смежные вопросы