一个下午,一台电脑,终结你 90% 的 Symfony 重复劳动
作者:互联网
2026-03-04
写 Symfony 项目时,琐碎且重复的底层工作其实挺让人头疼的,比如处理文件上传、写 CRUD 界面、同步数据库时间戳。如果每个项目都从零开始,不仅容易加班,代码还容易出 Bug。
我总结了 9 个 Symfony 扩展包。这些工具解决的都是开发中躲不开的痛点。
FOSElasticaBundle:让全文搜索快起来
当数据库数据量达到几十万条时,用 LIKE %...% 搜索会变得非常慢。FOSElastica 把 Elasticsearch 集成到了 Symfony 中。
我们可以直接通过 Finder 服务来搜索索引中的内容:
https://images.jiaoben.net$results = https://images.jiaoben.net$container->https://images.jiaoben.netget(https://images.jiaoben.net'fos_elastica.finder.app.article')->https://images.jiaoben.netfind(https://images.jiaoben.net'搜索关键词');
它最省心的地方在于,当你用 Doctrine 保存实体时,它会自动把数据同步到 Elasticsearch。
StofDoctrineExtensionsBundle:别再手动更新时间戳
以前每建一个表,我都要在 Entity 里写 setCreatedAt。一旦忘了写,数据追踪就断了。这个扩展包最常用的功能就是自动处理时间和生成 URL 别名(Slug)。
只要在字段上加个注解,剩下的事就不用管了:
https://images.jiaoben.netuse https://images.jiaoben.netGedmohttps://images.jiaoben.netMappinghttps://images.jiaoben.netAnnotation https://images.jiaoben.netas https://images.jiaoben.netGedmo;
https://images.jiaoben.nethttps://images.jiaoben.netclass https://images.jiaoben.netPost
{
https://images.jiaoben.net// 创建时自动填充
https://images.jiaoben.net#[GedmoTimestampable(https://images.jiaoben.neton: https://images.jiaoben.net'create')https://images.jiaoben.net]
https://images.jiaoben.net#[ORMColumn]
https://images.jiaoben.netprivate DateTime https://images.jiaoben.net$createdAt;
https://images.jiaoben.net// 只要有改动就自动更新
https://images.jiaoben.net#[GedmoTimestampable(https://images.jiaoben.neton: https://images.jiaoben.net'update')https://images.jiaoben.net]
https://images.jiaoben.net#[ORMColumn]
https://images.jiaoben.netprivate DateTime https://images.jiaoben.net$updatedAt;
https://images.jiaoben.net// 根据标题自动生成唯一的 URL 别名,不用自己写正则过滤
https://images.jiaoben.net#[GedmoSlug(https://images.jiaoben.netfields: [https://images.jiaoben.net'title'])https://images.jiaoben.net]
https://images.jiaoben.net#[ORMColumn(length: 150)]
https://images.jiaoben.netprivate https://images.jiaoben.net$slug;
}
LiipImagineBundle:搞定各种尺寸的缩略图
如果让用户直接上传 5MB 的图片并在列表页展示,页面加载会非常慢。LiipImagine 的思路是:原图存一份,缩略图按需生成并缓存。
在模板里直接调用定义好的滤镜:
{https://images.jiaoben.net# 自动生成并调用 120x120 的裁剪缩略图 #}
"{{ asset(product.image) | imagine_filter('thumbnail_120') }}" />
EasyAdminBundle:半天搭建出一套后台
如果项目需要一个后台管理界面,没必要从 HTML 模板写起。EasyAdmin 几乎是 Symfony 开发者的首选,它能通过简单的 PHP 类配置出完整的 CRUD。
https://images.jiaoben.nethttps://images.jiaoben.netclass https://images.jiaoben.netProductCrudController https://images.jiaoben.netextends https://images.jiaoben.netAbstractCrudController
{
https://images.jiaoben.netpublic https://images.jiaoben.netstatic https://images.jiaoben.nethttps://images.jiaoben.netfunction https://images.jiaoben.netgetEntityFqcn(https://images.jiaoben.net): https://images.jiaoben.netstring
{
https://images.jiaoben.netreturn https://images.jiaoben.netProduct::https://images.jiaoben.netclass;
}
https://images.jiaoben.netpublic https://images.jiaoben.nethttps://images.jiaoben.netfunction https://images.jiaoben.netconfigureFields(https://images.jiaoben.nethttps://images.jiaoben.netstring https://images.jiaoben.net$pageName): https://images.jiaoben.netiterable
{
https://images.jiaoben.netyield https://images.jiaoben.netTextField::https://images.jiaoben.netnew(https://images.jiaoben.net'name');
https://images.jiaoben.netyield https://images.jiaoben.netMoneyField::https://images.jiaoben.netnew(https://images.jiaoben.net'price')->https://images.jiaoben.netsetCurrency(https://images.jiaoben.net'CNY');
}
}
VichUploaderBundle:文件上传不再乱糟糟
手动写文件上传要判断后缀、重命名防止冲突、还要在数据库记录路径。而 VichUploader 把这些流程标准化了。
只需要在配置文件里定义好映射,在 Entity 里绑定一个 File 对象即可:
https://images.jiaoben.net#[VichUploadablehttps://images.jiaoben.net]
https://images.jiaoben.nethttps://images.jiaoben.netclass https://images.jiaoben.netUserProfile
{
https://images.jiaoben.net#[VichUploadableField(https://images.jiaoben.netmapping: https://images.jiaoben.net'avatars', https://images.jiaoben.netfileNameProperty: https://images.jiaoben.net'imageName')https://images.jiaoben.net]
https://images.jiaoben.netprivate ?File https://images.jiaoben.net$imageFile = https://images.jiaoben.netnull;
https://images.jiaoben.net#[ORMColumn]
https://images.jiaoben.netprivate ?https://images.jiaoben.netstring https://images.jiaoben.net$imageName = https://images.jiaoben.netnull;
https://images.jiaoben.netpublic https://images.jiaoben.nethttps://images.jiaoben.netfunction https://images.jiaoben.netsetImageFile(https://images.jiaoben.net?File https://images.jiaoben.net$imageFile = https://images.jiaoben.netnull): https://images.jiaoben.netvoid
{
https://images.jiaoben.net$this->imageFile = https://images.jiaoben.net$imageFile;
https://images.jiaoben.netif (https://images.jiaoben.net$imageFile) {
https://images.jiaoben.net$this->updatedAt = https://images.jiaoben.netnew https://images.jiaoben.netDateTimeImmutable();
}
}
}
KnpPaginatorBundle:分页逻辑一劳永逸
写分页最烦的就是算偏移量和总页数。我习惯直接把 Query 对象丢给 KnpPaginator,它能自动处理分页逻辑。
https://images.jiaoben.net// 在 Controller 里
https://images.jiaoben.net$pagination = https://images.jiaoben.net$paginator->https://images.jiaoben.netpaginate(
https://images.jiaoben.net$queryBuilder,
https://images.jiaoben.net$request->query->https://images.jiaoben.netgetInt(https://images.jiaoben.net'page', https://images.jiaoben.net1),
https://images.jiaoben.net12 // 每页数量
);
https://images.jiaoben.netreturn https://images.jiaoben.net$this->https://images.jiaoben.netrender(https://images.jiaoben.net'list.html.twig', [https://images.jiaoben.net'pagination' => https://images.jiaoben.net$pagination]);
在 Twig 里一行代码就能渲染出分页条:{{ knp_pagination_render(pagination) }}。
SchebTwoFactorBundle:安全加固其实很快
现在很多项目要求增加双重验证(2FA)。自己写验证码逻辑和 Google Authenticator 绑定很费劲,这个扩展包把安全流程都写好了。
只需要在 security.yaml 里开启:
security:
firewalls:
main:
two_factor:
auth_form_path: https://images.jiaoben.net2fa_login
check_path: https://images.jiaoben.net2fa_login_check
它会自动处理验证码的校验逻辑,我们只需要关注 UI 界面。
JMSTranslationBundle:多语言翻译不抓瞎
做多语言项目时,最怕漏掉某个页面的翻译键值。这个包能扫描整个项目,把所有需要翻译的内容提取出来。
https://images.jiaoben.net# 执行这个命令,它会自动更新你的 translation.yaml 文件
php bin/console translation:extract zh --config=app
它会找出所有 trans 标签和方法调用的内容,我们只需要对着文件填空,不用担心遗漏。
MakerBundle:高效生成的命令助手
这是大家最熟悉的,但很多人只用它生成 Entity。其实它能做的事情非常多,比如生成权限控制(Voter)或者自定义命令。
https://images.jiaoben.net# 快速生成一个权限检查器
php bin/console make:voter PostVoter
https://images.jiaoben.net# 快速生成一个 CRUD 完整流程(含 Controller、Form、Template)
php bin/console make:crud Product
养成使用命令行生成的习惯,能规避很多手写代码带来的低级错误。
在本地开发 Symfony 时,就不得不提配置 PHP 环境。有时候老项目要用 PHP 5.6,新项目要用 PHP 8.3,不同项目需要的扩展还不一样,在电脑里装一堆版本切来切去非常痛苦。
我最近在用 ServBay,它不仅能一键安装 PHP版本,支持 PHP 5.3到 PHP 8.6-dev,并且支持多版本 PHP 同时并存。
以前换个环境可能要折腾半天 Docker 或虚拟机,ServBay 是一键安装的,它把 PHP、MariaDB、PostgreSQL、Redis、Elasticsearch 这些开发常用的组件都集成在一起了。最方便的是,可以在一个界面里同时运行多个 PHP 版本,不用为了跑一个老项目去重装环境。
如果也受够了在本地折腾 brew install 或者改各种配置文件,尝试用 ServBay 配合上面这些 Bundle,能把更多精力放在业务逻辑上,开发节奏会顺畅很多。
最后
不要再把时间浪费在手动写上传和分页这种琐事上了。要么学会利用现成的轮子,要么就在无意义的搬砖中耗尽职业热情。你会发现,原来高质量的开发真的可以很快。
相关推荐
专题
+ 收藏
+ 收藏
+ 收藏
+ 收藏
+ 收藏
最新数据
相关文章
全新的 TP8+Workerman+BuildAdmin 整合方案,已有近 2000 次下载使用。
Laravel 13 正式发布 使用 Laravel AI 无缝平滑升级
FrankenPHP 原生支持 Windows 了
用 Laravel AI SDK 构建多智能体工作流
告别面条代码,PSL 5.0 重构 PHP 性能与安全天花板
告别阻塞!用 PHP TrueAsync 实现 PHP 脚本提速 10 倍
在 PHP 中写真正的异步代码 TrueAsync 0.6.0 已支持数据库链接池
PHP 异步与多线程 从 TrueAsync 展望未来
PHP 8.6 新特性预览,更简洁的语法与更严谨的类型控制
如何使用 PHP 的 for、while 和 foreach 循环实现极致性能与零 Bug 代码
AI精选
