一个下午,一台电脑,终结你 90% 的 Symfony 重复劳动

写 Symfony 项目时,琐碎且重复的底层工作其实挺让人头疼的,比如处理文件上传、写 CRUD 界面、同步数据库时间戳。如果每个项目都从零开始,不仅容易加班,代码还容易出 Bug。

我总结了 9 个 Symfony 扩展包。这些工具解决的都是开发中躲不开的痛点。

FOSElasticaBundle:让全文搜索快起来

当数据库数据量达到几十万条时,用 LIKE %...% 搜索会变得非常慢。FOSElastica 把 Elasticsearch 集成到了 Symfony 中。

我们可以直接通过 Finder 服务来搜索索引中的内容:

php 复制代码
$results = $container->get('fos_elastica.finder.app.article')->find('搜索关键词');

它最省心的地方在于,当你用 Doctrine 保存实体时,它会自动把数据同步到 Elasticsearch。

StofDoctrineExtensionsBundle:别再手动更新时间戳

以前每建一个表,我都要在 Entity 里写 setCreatedAt。一旦忘了写,数据追踪就断了。这个扩展包最常用的功能就是自动处理时间和生成 URL 别名(Slug)。

只要在字段上加个注解,剩下的事就不用管了:

php 复制代码
use Gedmo\Mapping\Annotation as Gedmo;

class Post
{
    // 创建时自动填充
    #[Gedmo\Timestampable(on: 'create')]
    #[ORM\Column]
    private \DateTime $createdAt;

    // 只要有改动就自动更新
    #[Gedmo\Timestampable(on: 'update')]
    #[ORM\Column]
    private \DateTime $updatedAt;

    // 根据标题自动生成唯一的 URL 别名,不用自己写正则过滤
    #[Gedmo\Slug(fields: ['title'])]
    #[ORM\Column(length: 150)]
    private $slug;
}

LiipImagineBundle:搞定各种尺寸的缩略图

如果让用户直接上传 5MB 的图片并在列表页展示,页面加载会非常慢。LiipImagine 的思路是:原图存一份,缩略图按需生成并缓存。

在模板里直接调用定义好的滤镜:

php 复制代码
{# 自动生成并调用 120x120 的裁剪缩略图 #}
<img src="{{ asset(product.image) | imagine_filter('thumbnail_120') }}" />

EasyAdminBundle:半天搭建出一套后台

如果项目需要一个后台管理界面,没必要从 HTML 模板写起。EasyAdmin 几乎是 Symfony 开发者的首选,它能通过简单的 PHP 类配置出完整的 CRUD。

php 复制代码
class ProductCrudController extends AbstractCrudController
{
    public static function getEntityFqcn(): string
    {
        return Product::class;
    }

    public function configureFields(string $pageName): iterable
    {
        yield TextField::new('name');
        yield MoneyField::new('price')->setCurrency('CNY');
    }
}

VichUploaderBundle:文件上传不再乱糟糟

手动写文件上传要判断后缀、重命名防止冲突、还要在数据库记录路径。而 VichUploader 把这些流程标准化了。

只需要在配置文件里定义好映射,在 Entity 里绑定一个 File 对象即可:

php 复制代码
#[Vich\Uploadable]
class UserProfile
{
    #[Vich\UploadableField(mapping: 'avatars', fileNameProperty: 'imageName')]
    private ?File $imageFile = null;

    #[ORM\Column]
    private ?string $imageName = null;

    public function setImageFile(?File $imageFile = null): void
    {
        $this->imageFile = $imageFile;
        if ($imageFile) {
            $this->updatedAt = new \DateTimeImmutable();
        }
    }
}

KnpPaginatorBundle:分页逻辑一劳永逸

写分页最烦的就是算偏移量和总页数。我习惯直接把 Query 对象丢给 KnpPaginator,它能自动处理分页逻辑。

php 复制代码
// 在 Controller 里
$pagination = $paginator->paginate(
    $queryBuilder, 
    $request->query->getInt('page', 1), 
    12 // 每页数量
);

return $this->render('list.html.twig', ['pagination' => $pagination]);

在 Twig 里一行代码就能渲染出分页条:{{ knp_pagination_render(pagination) }}

SchebTwoFactorBundle:安全加固其实很快

现在很多项目要求增加双重验证(2FA)。自己写验证码逻辑和 Google Authenticator 绑定很费劲,这个扩展包把安全流程都写好了。

只需要在 security.yaml 里开启:

php 复制代码
security:
    firewalls:
        main:
            two_factor:
                auth_form_path: 2fa_login
                check_path: 2fa_login_check

它会自动处理验证码的校验逻辑,我们只需要关注 UI 界面。

JMSTranslationBundle:多语言翻译不抓瞎

做多语言项目时,最怕漏掉某个页面的翻译键值。这个包能扫描整个项目,把所有需要翻译的内容提取出来。

php 复制代码
# 执行这个命令,它会自动更新你的 translation.yaml 文件
php bin/console translation:extract zh --config=app

它会找出所有 trans 标签和方法调用的内容,我们只需要对着文件填空,不用担心遗漏。

MakerBundle:高效生成的命令助手

这是大家最熟悉的,但很多人只用它生成 Entity。其实它能做的事情非常多,比如生成权限控制(Voter)或者自定义命令。

php 复制代码
# 快速生成一个权限检查器
php bin/console make:voter PostVoter

# 快速生成一个 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,能把更多精力放在业务逻辑上,开发节奏会顺畅很多。

最后

不要再把时间浪费在手动写上传和分页这种琐事上了。要么学会利用现成的轮子,要么就在无意义的搬砖中耗尽职业热情。你会发现,原来高质量的开发真的可以很快。

相关推荐
sino爱学习2 小时前
高性能线程池实践:Dubbo EagerThreadPool 设计与应用
java·后端
颜酱2 小时前
从二叉树到衍生结构:5种高频树结构原理+解析
javascript·后端·算法
掘金者阿豪2 小时前
UUID的隐形成本:一个让数据库“慢下来”的陷阱
后端
用户084465256372 小时前
Docker 部署 MongoDB Atlas 到服务端
后端
Anita_Sun3 小时前
一看就懂的 Haskell 教程 - 类型推断机制
后端·haskell
Anita_Sun3 小时前
一看就懂的 Haskell 教程 - 类型签名
后端·haskell
七八星天3 小时前
C#代码设计与设计模式
后端
砍材农夫4 小时前
threadlocal
后端
神奇小汤圆4 小时前
告别手写HTTP请求!Spring Feign 调用原理深度拆解:从源码到实战,一篇搞懂
后端