如何在Zend(ZF1)自定义路由中使用匹配功能

时间:2015-11-01 11:52:38

标签: php zend-framework zend-route

我正在Zend Framework 1.12下开发一个网站,用户可以上传图片来说明他们的个人资料。

我正在尝试实现一个功能,每次显示一个微缩模型时,如果它存在并将其保存为不同的大小(目的是通过减少HTTP请求大小来加速浏览):

  1. 注册用户上传完整尺寸的原始图片(例如2400 x 2400px 1MB)
  2. 图片保存在服务器上名为 USER_SIZE 的文件夹中
  3. 其他用户在网站上导航:
    • 主页或任何其他页面
    • 页面,其中包含我希望为每个用户显示50x50缩略图的用户列表
    • 我要显示100x100微缩图片的详细用户个人资料
  4. 要做到这一点,我希望使用一个自定义路由器来转换图片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 个答案:

答案 0 :(得分:0)

谢谢蒂姆,你是对的!

  

默认的ZF htaccess将忽略已存在的文件。如果您在与路径相同的URL处创建这些已调整大小的图像(但在公共文件夹中),则后续请求将绕过ZF。这不一定是坏事,但我认为这就是为什么它没有像你期望的那样工作。

问题与htaccess有关,我在其中保存了公共文件夹子目录中的IMG文件的URL重写参数。

我还必须将调整大小的图像存储在公共文件夹之外。