步骤 23: 调整图片尺寸

    这个工作是加入评论工作流的不二之选,很可能把它加在评论验证之后,发布它之前。

    我们来添加 状态和 optimize 状态转移:

    patch_file

    为这个新的工作流配置生成一个图形,用它来验证这是我们想要的流程:

    1. $ symfony console workflow:dump comment | dot -Tpng -o workflow.png

    可以用下面这个服务类来调整图片大小:

    src/ImageOptimizer.php

    1. namespace App;
    2. use Imagine\Gd\Imagine;
    3. use Imagine\Image\Box;
    4. class ImageOptimizer
    5. {
    6. private const MAX_WIDTH = 200;
    7. private const MAX_HEIGHT = 150;
    8. private $imagine;
    9. {
    10. }
    11. public function resize(string $filename): void
    12. {
    13. list($iwidth, $iheight) = getimagesize($filename);
    14. $ratio = $iwidth / $iheight;
    15. $width = self::MAX_WIDTH;
    16. $height = self::MAX_HEIGHT;
    17. if ($width / $height > $ratio) {
    18. $width = $height * $ratio;
    19. } else {
    20. $height = $width / $ratio;
    21. }
    22. $photo->resize(new Box($width, $height))->save($filename);
    23. }

    图片优化完成后,我们存储新的图片文件来代替原始图片。但你可能也会想要在某个地方保留原始图片。

    修改工作流,让它可以处理新的状态:

    patch_file

    config/packages/services.yaml

    1. services:
    2. _defaults:
    3. bind:
    4. $photoDir: "%kernel.project_dir%/public/uploads/photos"

    我们已经在 .symfony.cloud.yaml 里为上传文件定义了一个特殊的可读写目录。但是挂载是本地的。如果我们想要让 web 容器和消息消费者的 worker 进程也可以访问同一个挂载,我们需要创建一个 文件服务

    patch_file

    把它用于照片上传目录:

    patch_file

    1. --- a/.symfony.cloud.yaml
    2. +++ b/.symfony.cloud.yaml
    3. @@ -37,7 +37,7 @@ web:
    4. mounts:
    5. "/var": { source: local, source_path: var }
    6. - "/public/uploads": { source: local, source_path: uploads }
    7. + "/public/uploads": { source: service, service: files, source_path: uploads }
    8. build: |