Просмотр поста

.
Delphinum

ramzes, ну в "научных кругах" такой контролёр описывается "Фасадом", который создается над пачкой файлов и предоставляет единый интерфейс работы с хранилищем.

К примеру что то такое:

<?php
class FileStorageFacade{
  /**
   * @var string Адрес каталога хранилища.
   */
  private $dir;

  /**
   * @var Validator[] Валидаторы, применяемые к загружаемым файлам.
   */
  private $validators;

  /**
   * @var FileEditor Редакторы файлов.
   */
  private $editors;

  /**
   * @param string $dir Адрес каталога хранилища.
   */
  public function __construct($dir){
    $this->dir = $dir;
    $this->validators = [];
    $this->editors = [];
  }

  // Getters and Setters
  public function addValidator($validator){
    $this->validators[] = $validator;
  }

  public function addEditor($editor){
    $this->editors[] = $editor;
  }

  /**
   * @param string $file Адрес перемещаемого в хранилище файла.
   *
   * @return string Идентификатор перемещенного файла.
   */
  public function moveIn($file){
    if(!file_exists($file)){
      throw new RuntimeException('Target file not found');
    }
    // Проверка добавляемого файла.
    foreach($this->validators as $validator){
      if(!$validator->isValid($file)){
        throw new RuntimeException('Invalid file');
      }
    }

    $id = $this->generateId();
    rename($file, $this->dir . '/' . $id);
    // Тут лучше еще записать инфу о файле в базу.

    // Изменение добавленного файла.
    foreach($this->editors as $editor){
      $editor->edit($file);
    }

    return $id;
  }

  /**
   * @param UploadedFile $file Загружаемый в хранилище файл.
   */
  public function uploadIn(UploadedFile $file){
    $this->moveIn($file->getFile());
  }

  /**
   * @param string $id Идентификатор целевого файла.
   *
   * @return string Адрес файла в хранилище.
   */
  public function at($id){
    $path = $this->dir . '/' . $id;
    if(!file_exists($path)){
      return null;
    }

    return $path;
  }

  // Other
  /**
   * @return string Новый идентификатор в хранилище.
   */
  protected function generateId(){
    return (string) rand(1000, 9999); // Конечно нужно что то посерьезнее
  }
}
?>