ZetCode

Symfony SQLite 教程

最后修改时间:2025年3月3日

Symfony SQLite 教程演示了如何在 Symfony 7.2 中使用 SQLite。我们创建了用于 JSON 输出的路由,使用 fixtures 填充数据库,并在 HTML 中显示数据。

Symfony

Symfony 是一套可重用的 PHP 组件,也是一个用于 Web 项目的 PHP 框架。Symfony 于 2005 年发布为自由软件。Fabien Potencier 是 Symfony 的最初作者。Symfony 在很大程度上受到了 Spring 框架的启发。

SQLite

SQLite 是一个轻量级、无服务器、独立的 SQL 数据库引擎。它非常适合小型应用程序、原型和测试。

设置项目

我们首先创建一个新的 Symfony 项目并安装必要的依赖项。

$ composer create-project symfony/skeleton symfony-sqlite "^7.2"
$ cd symfony-sqlite

我们创建一个新的 Symfony 7.2 项目并导航到项目目录。

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle

我们安装 ORM pack 以支持数据库,并安装 maker bundle 以生成代码。

$ composer require symfony/validator
$ composer require symfony/serializer

我们安装 validator 和 serializer 组件以进行数据验证和 JSON 输出。

配置 SQLite

我们在 .env 文件中配置 SQLite。

.env
DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"

这会将 SQLite 配置为使用 var 目录中名为 data.db 的文件。

$ php bin/console doctrine:database:create

我们创建 SQLite 数据库。

创建实体

我们创建一个 Product 实体来存储产品数据。

$ php bin/console make:entity Product

我们创建 Product 实体,包含字段:name (字符串) 和 price (十进制)。

src/Entity/Product.php
<?php

declare(strict_types=1);

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
class Product
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\Column(length: 255)]
    private string $name;

    #[ORM\Column(type: 'decimal', precision: 10, scale: 2)]
    private string $price;

    // Getters and setters
    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName(): string
    {
        return $this->name;
    }

    public function setName(string $name): void
    {
        $this->name = $name;
    }

    public function getPrice(): string
    {
        return $this->price;
    }

    public function setPrice(string $price): void
    {
        $this->price = $price;
    }
}

Product 实体现在为 price 字段使用了 Decimal,以确保货币值的精度。

$ php bin/console make:migration
$ php bin/console doctrine:migrations:migrate

我们生成并运行迁移以创建数据库表。

使用 Fixtures

我们使用 fixtures 来填充数据库的示例数据。

$ composer require --dev doctrine/doctrine-fixtures-bundle

我们安装 fixtures bundle。

src/DataFixtures/ProductFixtures.php
<?php

declare(strict_types=1);

namespace App\DataFixtures;

use App\Entity\Product;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;

class ProductFixtures extends Fixture
{
    public function load(ObjectManager $manager): void
    {
        $products = [
            ['name' => 'Product A', 'price' => '19.99'],
            ['name' => 'Product B', 'price' => '29.99'],
            ['name' => 'Product C', 'price' => '39.99'],
        ];

        foreach ($products as $data) {
            $product = new Product();
            $product->setName($data['name']);
            $product->setPrice($data['price']);
            $manager->persist($product);
        }

        $manager->flush();
    }
}

ProductFixtures 类使用示例产品填充数据库。请注意,price 值现在作为字符串传递。

$ php bin/console doctrine:fixtures:load

我们将 fixtures 加载到数据库中。

创建用于 JSON 输出的路由

我们创建用于以 JSON 格式输出产品数据的路由。

src/Controller/ProductController.php
<?php

declare(strict_types=1);

namespace App\Controller;

use App\Entity\Product;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class ProductController extends AbstractController
{
    #[Route('/products', name: 'product_list', methods: ['GET'])]
    public function list(EntityManagerInterface $em): JsonResponse
    {
        $products = $em->getRepository(Product::class)->findAll();
        $data = [];

        foreach ($products as $product) {
            $data[] = [
                'id' => $product->getId(),
                'name' => $product->getName(),
                'price' => $product->getPrice(),
            ];
        }

        return $this->json($data);
    }

    #[Route('/products/{id}', name: 'product_show', methods: ['GET'])]
    public function show(Product $product): JsonResponse
    {
        return $this->json([
            'id' => $product->getId(),
            'name' => $product->getName(),
            'price' => $product->getPrice(),
        ]);
    }
}

ProductController 提供了两个路由:一个用于列出所有产品,另一个用于按 ID 显示单个产品。price 现在作为字符串返回。

在 HTML 中显示数据

我们创建了一个路由来在 HTML 中显示产品数据。

templates/product/list.html.twig
{% extends 'base.html.twig' %}

{% block title %}Product List{% endblock %}

{% block body %}
<h1>Product List</h1>
<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>Name</th>
            <th>Price</th>
        </tr>
    </thead>
    <tbody>
        {% for product in products %}
        <tr>
            <td>{{ product.id }}</td>
            <td>{{ product.name }}</td>
            <td>{{ product.price }}</td>
        </tr>
        {% endfor %}
    </tbody>
</table>
{% endblock %}

Twig 模板在 HTML 表中显示产品列表。price 显示为字符串。

src/Controller/ProductController.php
#[Route('/products/html', name: 'product_list_html', methods: ['GET'])]
public function listHtml(EntityManagerInterface $em): Response
{
    $products = $em->getRepository(Product::class)->findAll();
    return $this->render('product/list.html.twig', ['products' => $products]);
}

我们添加了一个路由来渲染 HTML 中的产品列表。

运行示例

$ php bin/console server:start

我们启动开发服务器。

$ curl localhost:8000/products
[{"id":1,"name":"Product A","price":"19.99"}, ...]
$ curl localhost:8000/products/1
{"id":1,"name":"Product A","price":"19.99"}

我们使用 curl 测试 JSON 路由。

$ curl localhost:8000/products/html

通过在浏览器中访问 URL 来查看 HTML 中的产品列表。

在此教程中,我们在 Symfony 7.2 中使用了 SQLite,创建了用于 JSON 输出的路由,使用 fixtures 填充了数据库,并在 HTML 中显示了数据。

列出 所有 Symfony 教程