Как использовать функцию соответствия в Zend (ZF1) Custom route

Я занимаюсь разработкой веб-сайта под Zend Framework 1.12, где пользователи могут загружать изображения для иллюстрации своего профиля.

Я пытаюсь реализовать функцию, которая будет проверять, каждый раз, когда миниатюра отображается, если она существует, и сохранять ее в разных размерах, если нет (цель состоит в том, чтобы ускорить просмотр путем уменьшения размера HTTP-запроса):

  1. Зарегистрированный пользователь загружает свое оригинальное изображение в полном размере (например, 2400 x 2400px 1MB)
  2. Изображение сохраняется в папке с именем USER_SIZE на сервере.
  3. Другие пользователи перемещаются по сайту:
    • домашняя страница или любая другая страница
    • страница со списком пользователей, где я хочу отобразить миниатюру 50х50 для каждого пользователя
    • подробный профиль пользователя, где я хочу отобразить миниатюрную картинку 100x100

Для этого я надеялся использовать настраиваемый маршрутизатор, который преобразует URL-адрес изображения, автоматически масштабирует / обрезает и сохраняет миниатюры, если они еще не существуют.

Публичная страница (вид):

<html>
<body>
  ...
  <img src="<?php echo $this->url(array("method" => "scale", "params" => "50x50", "filename" => $userFileName), "image")">
  ...
</body>
</html>

Пользовательский маршрут:

<?php

require_once 'Zend/Controller/Router/Route/Abstract.php';

Class Application_Controllers_Route_Image extends Zend_Controller_Router_Route_Abstract
{
  public static function getInstance(Zend_Config $config)
  {
    return new self($config->route);
  }

  // NOT WORKING
  public function match($path)
  {
    // Check if the URL is a miniature picture URL
    if (preg_match("#miniatures/([^/]+)/([^/]*)/(.+)#"){
      // resize picture and save miniature
      ...
    }
  }

  // WORKING
  public function assemble($data = array)
  {
    // Return a new path name for the miniature that should have been
    // resized and saved in a different folder for which the name is constructed
    // with params used in the view
    return sprint("miniatures/%s/%s/%s", $data["method"], $data["params"], $data["filename"]
  }
}

Конечно, весь этот код очень упрощен. Мне удалось настроить собственный маршрут для создания миниатюрного URL-адреса и получить что-то вроде miniatures/scale/50x50/userpicture.jpg в результате функции соответствия. Тем не менее, я полностью не могу перехватить вызов к маршрутизатору в функции соответствия. Это очень плохо документировано в документации Zend, и я не нашел никаких идей с Google или StackExchange.

Вы знаете, когда и как вызывается функция соответствия в рабочем процессе? Кто-нибудь сделал что-то подобное, что может помочь?

1 ответ

Решение

Спасибо, Тим, ты прав!

ZF htaccess по умолчанию будет игнорировать файлы, которые уже существуют. Если вы создаете эти изображения с измененным размером по тому же URL-адресу, что и ваш маршрут (но в общей папке), последующие запросы будут обходить ZF. Это не обязательно плохо, но я думаю, именно поэтому это не работает так, как вы ожидаете.

Проблема была связана с htaccess, в котором у меня был параметр перезаписи URL для файлов IMG, сохраненных в подкаталоге общих папок.

Мне также пришлось хранить изображения с измененным размером вне общей папки.

Другие вопросы по тегам