步骤 23: 调整图片尺寸
这个工作是加入评论工作流的不二之选,很可能把它加在评论验证之后,发布它之前。
我们来添加 状态和 optimize
状态转移:
patch_file
为这个新的工作流配置生成一个图形,用它来验证这是我们想要的流程:
$ symfony console workflow:dump comment | dot -Tpng -o workflow.png
可以用下面这个服务类来调整图片大小:
src/ImageOptimizer.php
namespace App;
use Imagine\Gd\Imagine;
use Imagine\Image\Box;
class ImageOptimizer
{
private const MAX_WIDTH = 200;
private const MAX_HEIGHT = 150;
private $imagine;
{
}
public function resize(string $filename): void
{
list($iwidth, $iheight) = getimagesize($filename);
$ratio = $iwidth / $iheight;
$width = self::MAX_WIDTH;
$height = self::MAX_HEIGHT;
if ($width / $height > $ratio) {
$width = $height * $ratio;
} else {
$height = $width / $ratio;
}
$photo->resize(new Box($width, $height))->save($filename);
}
图片优化完成后,我们存储新的图片文件来代替原始图片。但你可能也会想要在某个地方保留原始图片。
修改工作流,让它可以处理新的状态:
patch_file
config/packages/services.yaml
services:
_defaults:
bind:
$photoDir: "%kernel.project_dir%/public/uploads/photos"
我们已经在 .symfony.cloud.yaml
里为上传文件定义了一个特殊的可读写目录。但是挂载是本地的。如果我们想要让 web 容器和消息消费者的 worker 进程也可以访问同一个挂载,我们需要创建一个 文件服务:
patch_file
把它用于照片上传目录:
patch_file
--- a/.symfony.cloud.yaml
+++ b/.symfony.cloud.yaml
@@ -37,7 +37,7 @@ web:
mounts:
"/var": { source: local, source_path: var }
- "/public/uploads": { source: local, source_path: uploads }
+ "/public/uploads": { source: service, service: files, source_path: uploads }
build: |