当我们在使用云服务时,特别是OSS服务管理图片时,可以很方便的从云服务动态返回图片的参数,比如说图片尺寸、格式、水印等
就像 a.jpg?w=100&fm=wepb等各种参数
接下来我就为大家演示一下如何使用symfony配合其它组件快速制作一个类似的服务
首先我们需要安装GD库,然后创建一个symfony项目。接下来生成一个控制器,把/路由返回到index.html.twig上
# src\Controller\IndexController.php
class IndexController extends AbstractController
{
#[Route('/', name: 'app_index')]
public function index(): Response
{
return $this->render('index/index.html.twig', [
'controller_name' => 'IndexController',
]);
}
}
同时我们写一个路由,用于处理图片请求
# src\Controller\IndexController.php
#[Route('/image', name: 'image')]
public function getImage(Request $request)
{
}
在index.html.twig上写一个图片标签
<img src="{{ path('image',{
path:'a.jpg',
fm:'webp',
w:100,
h:200,
fit:'crop'
}) }}">
因为我是做测试,所以我提前在项目的public/images/目录里放置了a.jpg图片文件。在twig里请求/image这个路由
接下来安装一个库:
composer req league/glide-symfony
然后去处理我们的图片
# src\Controller\IndexController.php
use League\Glide\Responses\SymfonyResponseFactory;
use League\Glide\ServerFactory;
#[Route('/image', name: 'image')]
public function getImage(Request $request)
{
$server = ServerFactory::create([
'source' => $this->getParameter('kernel.project_dir') . '/public/images',
'cache' => $this->getParameter('kernel.project_dir') . '/public/cache',
]);
$query = $request->query->all();
$path = $query['path'];
unset($query['path']);
$server->outputImage($path, $query);
return new Response();
}
刷新页面,效果是不是就出来了?除了一个小小的问题:
我们查看开发者工具,然后在网络里找到image这个请求,查看“预览”或者“响应”,是不是看到了乱码?接下来我们再稍微修改一下代码:
#[Route('/image', name: 'image')]
public function getImage(Request $request): Response
{
$server = ServerFactory::create([
'response' => new SymfonyResponseFactory(),
'source' => $this->getParameter('kernel.project_dir') . '/public/images',
'cache' => $this->getParameter('kernel.project_dir') . '/public/cache',
]);
$query = $request->query->all();
$path = $query['path'];
unset($query['path']);
return $server->getImageResponse($path, $query);
}
刷新: 完美了