Laravel 5干预 - 图像/干预 - 缓存:灵活的URL /路由

时间:2015-03-17 12:14:31

标签: php image caching laravel laravel-5

在Laravel 5中摆弄Intervention 2.0。我想要的是操纵图像(大小和裁剪)并使用干预Image Caching来缓存图像。我基本上试图实现的是旧的(和不安全的)timthumb.php的功能。

我开始以此为例:

// routes.php
Route::get('imager/{src?}', function ($src)
{
    $cacheimage = Image::cache(function($image) use ($src) {
        return $image->make("files/image/".$src)->resize(100,50);
    }, 10, true);

    return Response::make($cacheimage, 200, array('Content-Type' => 'image/jpeg'));
});

当我加载这样的图片时:

// template
<img src="{{"imager/image.jpg"}}"/>

工作正常。

但是......在我的情况下,图像可以位于不同的(子)目录中,有时可以位于多个深层。它们由网站管理员在我的CMS中维护。

示例:

  • 的文件/图像/ image.jpg的
  • 的文件/图像/标头/ image.jpg的
  • 的文件/图像/背景/颜色/ image.jpg的
  • IMG /普通/ logo.png

这些图片网址是从mysql表记录中加载的。

加载此类图片时

// template
<img src="{{"imager/files/images/image.jpg"}}"/>

该路线不再有效。毕竟,文件图片 images.jpg 都是网址段,它们的数量可能不同

图片网址(粗体)应作为一个变量处理:

路线:: get(&#39; imager / files / images / image.jpg &#39;,功能($ src = false)

然后我应该能够通过大小和裁剪参数。因为img url长度可能会有所不同,我假设我可以通过查询来传递参数,例如?w = 100&amp; h = 50&amp; c = true或其他什么?


更新

当我为图片网址使用查询参数时:

Route::get('imager', function ()
{
    $src = Input::get('src', 1);

    $cacheimage = Image::cache(function($image) use ($src) {
        return $image->make($src)->resize(100,100);
    }, 1, false); // one minute cache expiry

    return Response::make($cacheimage, 200, array('Content-Type' => 'image/jpeg'));
});

// template
<img src="{{"imager?src=files/images/image.jpg"}}"/>

这很有效。

2 个答案:

答案 0 :(得分:3)

很简单。你只需要告诉Laravel你的图像参数由字母,斜线,短划线,下划线和点('[A-Za-z0-9\/\.\-\_]+')组成,因为默认情况下框架匹配除了斜杠/之外的所有内容。

Route::get('imager/{image?}', function($src) {

    $cachedImage = Image::cache(function($image) use ($src) {
        return $image->make($src)->resize(100,100);
    }, 1, false);

    return Response::make($cachedImage, 200, ['Content-Type' => 'image/jpeg']);
})->where('image', '[A-Za-z0-9\/\.\-\_]+');

您可以在documentation中找到有关参数绑定的更多信息。

答案 1 :(得分:0)

现在您可以使用URL based image manipulation

  

在Laravel应用程序中,可以使用URL动态地操作图像。图像的操作版本将存储在缓存中,并且无需资源密集型GD操作即可直接加载。

     

图片仅需上传一次。当通过HTTP请求访问文件时,诸如调整大小或裁剪的所有操作将在以后处理:

     

http://yourhost.com/{route-name}/{template-name}/{file-name}