Koenig,  а зачем свой Kfile есть SplFileInfo, который может все то же?            
                        
         
            
            
            
                Delphinum,  ну там же ещё методы добавляются            
                        
         
            
            
            
                Koenig,  generatehash? Я бы вынес его в интерфейс или в FileStorage (или и то и другое). Файл это файл )            
                        
         
            
            
            
                storage -> upload -> storage -> file
?            
                        
         
            
            
            
                ramzes,  я бы предложил:
PSR7 (UploadedFile) -> Storage -> SplFileInfo            
                        
         
            
            
            
                т.е. аплоад инициализируется логикой? не хранилищем?            
                        
         
            
            
            
                ramzes,  Не обязательно, можно сделать фассадный метод:
class FileStorage{
  public function upload($name){
    $file = UploadedFile::fromGlobal($name);
    $this->moveIn($file);
  }
}
Просто мне кажется что ваше хранилище файлов может пригодиться не только для загрузки файлов клиентом, но и для хранения вообще всех файлов которые есть в системе (к примеру для хранения превьюшек и файлок, загружаемых через всякие парсеры). В этом случае у файлового хранилища должна быть только логика добавления готового файла в него, а логика загрузки файла это отдельная тема.            
 
                        
         
            
            
            
                # Delphinum (25.08.2016 / 17:32)
Koenig,  generatehash? Я бы вынес его в интерфейс или в FileStorage (или и то и другое). Файл это файл )
Я бы поспорил. Это ведь придётся везде за собой FileStorage таскать даже там, где он не нужен. И почему файл не может знать о хэше? Не вижу в этом ничего страшного. Единственное, что не нравится, так это имена методов. Вместо generatehash() я бы написал getMd5Hash(), а вместо data() -- asArray() или toArray().            
 
                        
         
            
            
            
                reaper,  если тебе необходимо в любом месте системы получать md5 хеш файла, то да, это должно относится к файлу, но если md5 хеш файла нужен только для сохранения его в хранилище (и получения его из хранилища), то это не часть файла и ее лучше вынести. Зависит от задачи )